【问题标题】:Compare two table and adding row based on condition比较两个表并根据条件添加行
【发布时间】:2015-07-30 02:25:54
【问题描述】:

我想将 dt1dt2 进行比较,如果 dt1dt2 比较的列值存在,它不会添加行或更改该行中的值。因此,当值不同时,如 dt2 在 A 列中有“4”和“5”的示例中所示,它将添加“4”和“5”到 dt1 表,但它不会替换 dt1 A 中的“1”、“2”或“3”值列,因为它已经存在。

编辑:我想以主键的形式使用 A 列来检查两个表中的 A 列中是否存在“1”,然后没有任何变化,但如果存在 A 列值在 dt2(示例:“4”)中但不在 dt1 中,然后我希望合并该行数据带 dt1 表

dt1 
A   B   C   
1   4   7   
2   5   8   
3   6   9   

dt2
A   B   C  
1   10  13  
2   12  15  
3   11  14  
4   1   20
5   12  3

dt1
A   B   C   
1   4   7   
2   5   8   
3   6   9    
4   1   20
5   12  3

【问题讨论】:

标签: r join merge


【解决方案1】:

您可以将dt1dt2 中的行绑定,这些行在dt1 中没有A 值,只需一个条件语句即可

rbind(dt1, dt2[!(dt2$A %in% dt1$A),])
#   A  B  C
# 1 1  4  7
# 2 2  5  8
# 3 3  6  9
# 4 4  1 20
# 5 5 12  3

【讨论】:

    【解决方案2】:

    或者使用dplyr,我们使用bind_rows得到'dt2'中不属于'dt1'的行,按'A'和anti_joinrbind和'dt1'分组

     library(dplyr)
     anti_join(dt2, dt1, by='A') %>% 
                           bind_rows(dt1, .)
    

    或者另一种选择是使用rbindlist rbind 两个数据集并根据“A”列获取unique

     library(data.table)
     unique(rbindlist(list(dt1, dt2)), by='A')
    

    或者正如@Arun在cmets中提到的,如果我们使用'data.table'的devel版本,即v1.9.5(安装devel版本的说明是here),on选项可以用来加入两个数据集没有指定键来获取 'dt2' 中不在 'dt1' 和 rbind 中的行与 'dt1'

      rbind(dt1, dt2[!dt1, on="A"])
    

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多