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

问题描述 投票:1回答:1

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

这里的任何帮助都会很棒

谢谢

r dataframe
1个回答
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]添加列n与值zDF1
  • z = x[i, on=, x.v]使用i查找x行然后返回列v,其中...... x = uDF v = Counts i = .SD$NameDF1中发现的名字的向量

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

© www.soinside.com 2019 - 2024. All rights reserved.