比较R数据帧中的多列中的值&更新缺失值

时间:2018-04-23 14:59:12

标签: r dataframe

我有3个数据帧。 第一个df包含一列 - 名称 -

df 1
    Name 
    A    
    B    
    C    
    D    
    E    
    F    
    G  
    H
    I
    J
    K   

第二个df包含两列 - 名称和计数但是某些名称可能会或可能不会从第一个df中丢失。

df 2 - 
  Name   Counts 
    A    12
    B    23
    C    34
    D    56
    E    34
    K    44

我想比较从第二个df到第一个df的所有名称,如果没有名字丢失,那么很好。 如果缺少任何名称,则必须从第三个df填写该名称及其计数。第三个df将始终包含名称和计数。

df 3 - 
 Name   Counts 
    A    34
    B    45
    C    34
    D    56
    E    67
    F    435
    G    45
    H    76
    I    76
    J    88
    K    90

所以在上面的例子中由于F,G,H,I,J在第二个df中缺失,因此应该从df 3添加它们的信息。

和 第二个df应更新为 -

Name   Counts 
    A    12
    B    23
    C    34
    D    56
    E    34
    F    435
    G    45
    H    76
    I    76
    J    88
    K    44

这里的任何帮助都很棒

谢谢

1 个答案:

答案 0 :(得分:2)

你可以......

library(data.table)
setDT(DF1); setDT(DF2); setDT(DF3)

DF1[, n := unique(rbind(DF2, DF3), by="Name")[.(.SD$Name), on=.(Name), x.Counts]]

向DF1添加一列:

    Name   n
 1:    A  12
 2:    B  23
 3:    C  34
 4:    D  56
 5:    E  34
 6:    F 435
 7:    G  45
 8:    H  76
 9:    I  76
10:    J  88
11:    K  44

您可以改为执行merge(DF1, unique(rbind(DF2, DF3), by="Name"), all.x=TRUE),但这会创建一个新表而不是向现有表添加列。此合并的dplyr模拟是left_join(DF1, bind_rows(DF2, DF3) %>% distinct(Name))

工作原理

  • DF = rbind(DF2, DF3)附加两个源表
  • uDF = unique(DF, by="Name")保留每个Name
  • 的第一行
  • DF1[, n := z]nz添加到DF1
  • z = x[i, on=, x.v]使用i查找x行,然后返回列v,其中......
    • x = uDF
    • v = Counts
    • i = .SD$NameDF1
    • 中找到的名字的向量
.SD的{​​{1}}中的{p> j指的是DT[i, j]本身,即“数据子集”。