首页 > 解决方案 > 两个数据帧之间的不同单元格

问题描述

我需要两个数据框之间的差异。setdiff() 给了我修改和新的行。但它显示了一个完整的修改行,但我只想要不同的单元格。这个怎么做?我假设列数是相同的。

输入数据:

df1 <- data.frame(ID = c(1, 2, 3),
                  A = c(1, 2, 3),
                  B = c(1, 2, NA))
df2 <- data.frame(ID = c(1, 2, 3, 4),
                  A = c(1, 2, 3, 4),
                  B = c(1, 2, 3, NA))

newdata = setdiff(df2,df1) # don't give results as my expectation

因此,它应该是这样的数据框:

result <- data.frame(ID = c(3, 4),
                     A = c(NA, 4),
                    B = c(3, NA))

列 ID 应保留并始终包含值。

概括:

  1. 输出应仅包含 df2 中的新行或修改的行。
  2. 在修改的行中应该只显示修改的或新的单元格。
  3. ID 列中的值即使没有被修改也应该显示出来。

比较,比较_df?这个怎么做?

标签: rset-difference

解决方案


您可以在单独的步骤中执行此操作,因为您将不同的逻辑应用于不同的列(ID 与 A),但不能作为所有列的集合来实现。

df1 <- data.frame(ID = c(1, 2, 3),
              A = c(1, 2, 3),
              B = c(1, 2, NA))
df2 <- data.frame(ID = c(1, 2, 3, 4),
              A = c(1, 2, 3, 4),
              B = c(1, 2, 3, NA))
newdata = setdiff(df2,df1)
newdata
   ID A  B
1  1 1  1
2  2 2  2
3  3 3  3
4  4 4 NA

您可以将逻辑应用于列 A 和 B,而不是将其应用于 ID,

newdata$A[which(df2$A == df1$A)] <- NA

newdata$B[which(df2$B == df1$B)] <- NA

newdata
  ID  A  B
1  1 NA NA
2  2 NA NA
3  3 NA  3
4  4  4 NA

newdata[3:4,]

有比我好得多的巫师可能会提出意见,但我认为没有办法在 ID 限制的情况下一次性做到这一点。


推荐阅读