用另一个数据框中的信息填充一个数据框中的缺失数据
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 中保留唯一值的情况。
有两个数据集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 中保留唯一值的情况。