R:在数据框中找到非对应的列

时间:2019-10-10 17:47:19

标签: r dataframe match extract

考虑这个小示例数据帧(实际数据帧很大):

df <- data.frame(ID=c("C_40", "C_40", "A_301", "A_301", "T_014", "C_4301", "C_4301", "A_345"), genID=c("1", "1", "2", "2", "3","3","4", "4"))

我正在努力解决以下问题: 您会看到始终有2个与genID对应的ID。

“正确”的情况是ID和genID列匹配,因此前2个(C_48为1,A_301为2)。 其他都是“ false”,我需要检测到它们(在此示例中,genID 3具有不匹配的ID = T_014和C_4301; genID4也是一样。

您知道我如何提取这些不匹配案例的方法吗?例如。到仅显示不匹配项的数据帧,例如,如下所示:

 ID     genID
T_014   3
C_4301  3
C_4301  4
A_345   4

所以我需要相同genID具有不同ID的情况... 谢谢您的任何建议!

2 个答案:

答案 0 :(得分:1)

我们根据“ genID”和filter进行分组,条件是不同的“ ID”的数量等于2。

library(dplyr)
df %>% 
   group_by(genID) %>% 
   filter(n_distinct(ID) == 2)
# A tibble: 4 x 2
# Groups:   genID [2]
#  ID     genID
#  <fct>  <fct>
#1 T_014  3    
#2 C_4301 3    
#3 C_4301 4    
#4 A_345  4    

答案 1 :(得分:1)

如果您正在寻找一种适用于大型数据集的非常有效的解决方案,我建议您使用data.table软件包。此代码段应满足您的需求。

library(data.table)
setDT(df)
unique(df)[, .(ID, count=.N), genID][count>1][, count:=NULL][]

##     genID     ID
##  1:     3  T_014
##  2:     3 C_4301
##  3:     4 C_4301
##  4:     4  A_345