从缺少不同值但其他方面相同的数据框列表开始。
df1 <- df2 <- df3 <- df4 <- head(iris)
df1[4,2] <- NA
df2[3,5] <- NA
df3[2,] <- NA
df4[2,2] <- NA
lst <- list(df1, df2, df3, df4)
合并这些数据帧的最佳(计算速度快)方法是什么,以便在至少一个数据帧中提供信息的任何缺失值都消失了?
注意:最好只使用 base R.
我会
Reduce
覆盖它们并使用 is.na
和 [<-
替换。
done <- Reduce(function(prev, this) {
isna <- is.na(this)
if (any(isna)) this[isna] <- prev[isna]
this
}, lst)
done
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
仅供参考,在this示例中,所有值都在第二次迭代中解析。我们可以通过添加
accumulate=TRUE
来查看每次“减少”的结果:
Reduce(function(prev, this) { isna <- is.na(this); if (any(isna)) this[isna] <- prev[isna]; this; }, lst, accumulate = TRUE)
# [[1]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 NA 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
# [[2]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
# [[3]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
# [[4]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
如果你想在不需要进一步插补时“提前逃脱”,我相信需要一个自定义
for
循环。
for (i in seq_along(lst)[-1]) {
message(i)
isna <- is.na(lst[[1]])
if (!any(isna)) { message("out!"); break(); }
lst[[1]][isna] <- lst[[i]][isna]
}
# 2
# 3
# out!
lst[[1]]
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa