用另一个数据框中的信息填充一个数据框中的缺失数据

filling in missing data in one data frame with info from another

有两个数据集A&B,如下:

A <- data.frame(TICKER=c("00EY","00EY","00EY","00EY","00EY"), 
                CUSIP=c(NA,NA,"48205A10","48205A10","48205A10"), 
                OFTIC=c(NA,NA,"JUNO","JUNO","JUNO"), 
                CNAME=c(NA,NA, "JUNO", "JUNO","JUNO"), 
                ANNDATS=c("2015-01-13","2015-01-13","2015-01-13","2015-01-13","2015-01-13"),
                ANALYS=c(00076659,00105887,00153117,00148921,00086659),
                stringsAsFactors = F)

B <- data.frame(TICKER=c("00EY","00EY","00EY","00EY"), 
                CUSIP=c("48205A10","48205A10","48205A10","48205A10"),
                OFTIC=c("JUNO","JUNO",NA,NA), 
                CNAME=c("JUNO","JUNO", NA, NA), 
                ANNDATS=c("2015-01-13","2015-01-13","2015-01-13","2015-01-13"), 
                ANALYS=c(00076659,00105887,00153117,00148921), 
                stringsAsFactors = F)

如何用另一个数据框中的信息填充一个数据框中缺失的数据? (A&B数据集长度不一样)

由于两个数据集可以有不同的长度,你需要一些可以连接它们的特征。看起来 ANALYS 是某种标识符,我们可以用它来连接本例中的两个 data.frames。

首先我们确定 df1 中的所有缺失(即 A)并获取它们的索引(行和列)。
然后,df1 中的缺失值被 df2 中的值替换,对应于具有相同值 ANALYS 的行。如果此 ID 在 df2 中不可用,将跳过该行。

f <- function(df1, df2){
  missings <- sapply(df1, is.na)
  missingsInd <- which(missings, arr.ind = T)

  for(i in 1:nrow(missingsInd)){
    idOfMissing <- df1$ANALYS[missingsInd[i,1]]
    correspondingLine <- df2[which(df2$ANALYS == idOfMissing), ]
    if (nrow(correspondingLine) != 0) {
      df1[missingsInd[i,1], missingsInd[i,2]] <-  correspondingLine[1,missingsInd[i,2]]
    }
  }
  df1
}
f(A, B)
#   TICKER    CUSIP OFTIC CNAME    ANNDATS ANALYS IRECCD
# 1   00EY 48205A10  JUNO  JUNO 2015-01-13  76659      1
# 2   00EY 48205A10  JUNO  JUNO 2015-01-13 105887      2
# 3   00EY 48205A10  JUNO  JUNO 2015-01-13 153117      1
# 4   00EY 48205A10  JUNO  JUNO 2015-01-13 148921      3
# 5   00EY 48205A10  JUNO  JUNO 2015-01-13  86659      4

请注意 data.frames 中具有 NA 的单元格将 return 与输出中的 NA 相同。此外,这仅适用于 ANALYS 仅在 data.frames 中保留唯一值的情况。