繁体   English   中英

比较R数据框中多列中的值并更新缺失值

[英]Comparing values in multiple columns in R dataframes & updating missing values

我有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

因此,在上述示例中,由于第二个df中缺少F,G,H,I,J,因此应从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

任何帮助都会很棒

谢谢

你可以做...

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]将值为zn添加到DF1
  • z = x[i, on=, xv]使用i查找x行,然后返回v列,其中...
    • x = uDF
    • v = Counts
    • i = .SD$Name是在DF1找到的i = .SD$Name的向量

DT[i, j] j.SD指的是DT本身,即“数据子集”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM