根据字符串向量对数据帧进行子集

时间:2020-01-16 13:33:42

标签: r design-patterns subset stringr

我有一个名为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和其他列?

任何想法都将不胜感激。

2 个答案:

答案 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]