我有一个名为genetics的大型数据集,需要进行分解。有4列,第一列是有时重复的PatientID,而3列描述了患者。
如前所述,某些患者ID是重复的,我想知道哪些ID,而不会丢失其余的列。
dedupedGenID<- unique(Genetics$ID)
只会给我唯一的ID,不带列。
为了通过我做过的那些唯一ID将df子集
dedupedGenFull <- Genetics[str_detect(Genetics$patientID, pattern=dedupedGenID,]
这给我一个错误:“较长的对象长度不是较短的对象长度的倍数”,并且dedupedGenFull只有55行,而dedupedGenID是1837的字符向量。
我的问题是:如何正确执行该设置步骤?我该如何做,但要相乘,即如何对df进行子集处理,以便获得重复的那些患者的ID和其他列?
任何想法都将不胜感激。
答案 0 :(得分:0)
library(data.table)
genetics <- data.table(genetics)
genetics[,':='(is_duplicated = duplicated(ID))]
此块将根据您的数据创建一个data.table,并添加一个新列,如果ID重复,则该列包含TRUE,否则应包含FALSE。但是它仅标记为重复,这意味着第一个将被标记为FALSE。
答案 1 :(得分:0)
我们可以使用duplicated
来获取ID
并乘以subset
数据
subset(Genetics, ID %in% unique(ID[duplicated(ID)]))
另一种方法可能是用ID
计算行数并选择大于1的行。
这可以在基数R中完成:
subset(Genetics, ave(seq_along(ID), ID, FUN = length) > 1)
dplyr
library(dplyr)
Genetics %>% group_by(ID) %>% filter(n() > 1)
和data.table
library(data.table)
setDT(Genetics)[, .SD[.N > 1], ID]