查找数据框之间的不匹配

时间:2019-12-31 03:02:08

标签: r dataframe

我有一个称为ref的参考数据帧。我想将ref中的元素与一组数据帧进行比较,然后将不匹配项插入列表中。值为0、1和NA。下面的样本数据集:

ref <- structure(list(ID = structure(c(2L, 1L, 3L), .Label = c("bar", 
"foo", "hello"), class = "factor"), a = c(1, 0, 0), b = c(1, 
1, 0), c = c(1, 1, 1)), class = "data.frame", row.names = c(NA, 
-3L))

df1 <- structure(list(ID = structure(2:1, .Label = c("bar", "foo"), class = "factor"), 
    b = c(0, 0), f = c(NA, 0), a = c(1, 1)), class = "data.frame", row.names = c(NA, 
-2L))

参考:

     ID a b c
1   foo 1 1 1
2   bar 0 1 1
3 hello 0 0 1

df1

   ID b f  a
1 foo 0 NA 1
2 bar 0 0  1

数据帧未排序。引用ID均包含在内。目的是比较具有相同ID和colname的元素,并根据colname列出不匹配项。 df1的所需列表为:

df1_list

$a
[1] "bar"

$b
[1] "foo" "bar"

主要问题是列名不是全部相同,也不是按顺序排列。如果我要对许多数据帧中的每一个执行此操作,则将变得相当复杂。我也无法通过连接函数解决这个问题。

1 个答案:

答案 0 :(得分:1)

这是使用基数R的一种方法:

cols <- intersect(names(df1[-1]), names(ref[-1]))
rows <- match(df1$ID, ref$ID)
apply(df1[cols] != ref[rows, cols], 2, function(x) as.character(df1$ID[x]))

#$b
#[1] "foo" "bar"

#$a
#[1] "bar"