首页 > 解决方案 > 通过对多个列使用另一个数据表来替换缺失的数据

问题描述

我的表中有很多列,其中缺少数据。如果基于ID. 我考虑过可能加入这两个表并编写一个 for 循环,其中 if column然后从 columnXNA提取信息Y,但是,我有很多列并且需要编写许多这些条件。

我想创建一个函数或循环,我可以在其中传递缺少数据的数据列名,并能够从另一个表中传递列名以从中获取信息。

可重现的例子:

ID <- c(1,2,3,4,5,6)
Year <- c(1990,1987,NA,NA,1968,1992)
Month <- c(1,NA,8,12,NA,5)
Day <- c(3,NA,NA,NA,NA,30)

New_Data = data.frame(ID=ID,Year=Year,Month=Month,Day=Day)

ID <- c(2,3,4,5)
Year <- c(NA,1994,1967,NA)
Month <- c(4,NA,NA,10)
Day <- c(23,12,16,9)

Old_Data = data.frame(ID=ID,Year=Year,Month=Month,Day=Day)

预期输出:

ID <- c(1,2,3,4,5,6)
Year <- c(1990,1987,1994,1967,1968,1992)
Month <- c(1,4,8,12,10,5)
Day <- c(3,23,12,16,9,30)
New_Data = data.frame(ID=ID,Year=Year,Month=Month,Day=Day)

标签: rdata-manipulationmissing-data

解决方案


使用rbind组合两个数据框,然后我们使用group_bywithsummarise_all

library(dplyr)
rbind(New_Data,Old_Data)%>%group_by(ID)%>%dplyr::summarise_all(function(x) x[!is.na(x)][1])
# A tibble: 6 x 4
     ID  Year Month   Day
  <dbl> <dbl> <dbl> <dbl>
1     1  1990     1     3
2     2  1987     4    23
3     3  1994     8    12
4     4  1967    12    16
5     5  1968    10     9
6     6  1992     5    30

推荐阅读