我在 R 中处理不同的数据集。每个数据集最多有 16 列和 1000 条记录。我试图找到一种方法来一次比较两个数据集,以便我可以找到已删除/更新/添加的记录。我将使用 ID 列和颜色列来识别差异。下面是一个小集合的例子(没有包括所有的列):
df1 <- data.frame(ID = letters[1:5], color = c("blue", "white", "red", "green", "blue"))
df2 <- data.frame(ID = c("a","c","d","d"), color = c("blue", "yellow", "green", "blue"))
ID 将是数据集
之间的公因数。
我需要比较数据集
以获得三组不同的值:
新记录: 出现在 df1 但不出现在 df2 中的记录。所以我应该得到:
ID Color
b white
c red
e blue
删除的记录: 没有出现在 df1 但确实出现在 df2 中的记录
ID Color
c yellow
d blue
更新记录 这是我需要的最重要的。基本上任何具有相同 ID 但颜色不同的东西:
ID df1color df2color
c red yellow
我尝试使用 dplyr
包中的连接....但没有成功。有什么方法可以在 R
中做到这一点。
最佳答案
您可能要处理的一个问题是 data.frame()
在幕后混淆了字符变量和因子变量。检查数据框的 str()
。相反,最好使用 tibble()
,您可以从 dplyr 或 tibble 包中获取它。
然后,从@Stedy 发布的链接,您可以使用 dplyr 的 anti_join()
来处理前两个问题。最后一个可以通过将 inner_join()
应用于新记录的数据框,然后使用 filter()
来查找更改来完成。请参见下面的示例:
library(dplyr)
df1 <- tibble(ID = c(letters[1:5]), color = c("blue", "white", "red", "green", "blue"))
df2 <- tibble(ID = c("a","c","d","d"), color = c("blue", "yellow", "green", "blue"))
# New Records
anti_join(df1, df2)
#> # A tibble: 3 x 2
#> ID color
#> <chr> <chr>
#> 1 e blue
#> 2 c red
#> 3 b white
# Deleted records (simply swap arguments around)
anti_join(df2, df1)
#> # A tibble: 2 x 2
#> ID color
#> <chr> <chr>
#> 1 d blue
#> 2 c yellow
# Updated records
new_records <- anti_join(df1, df2)
inner_join(new_records, df2, by = "ID", suffix = c(".df1", ".df2")) %>%
filter(color.df1 != color.df2)
#> # A tibble: 1 × 3
#> ID color.df1 color.df2
#> <chr> <chr> <chr>
#> 1 c red yellow
关于r - 比较表以查找更新/删除/新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39734005/