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

时间:2017-08-14 11:48:44

标签: r missing-data

有两个数据集,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&amp; B数据集的长度不同)。

1 个答案:

答案 0 :(得分:0)

由于两个数据集可以有不同的长度,因此您需要一些可以连接的功能。看起来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 s的单元格将返回NA,如输出中所示。此外,这仅适用于ANALYS仅在两个data.frames中保存唯一值的情况。