r - 比较表以查找更新/删除/新

标签 r

我在 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/

相关文章:

R在导入xlsx时自动将日期转换为字符串

r - 如何用密度图覆盖线图? (R,ggplot2)

regex - 从字符串中提取和合并数字

r - 沿日期刻度线放置网格

r - 从facet_wrap更改标题的字体大小

java - 如何在 R 或 java 中进行栅格数据同化( 3dVar )?

html - 如何在 Shiny 中更改导航栏页面折叠的断点

r - 使用 ggplot2/ggfortify 更改 PCA 图中的载荷(箭头)长度?

r - ggplot2 中日期列和 geom_ribbon 的问题

r - 删除矩阵中的行