合并在不同地方有缺失值的相同数据框列表

问题描述 投票:0回答:1

从缺少不同值但其他方面相同的数据框列表开始。

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.

r dataframe merge na
1个回答
2
投票

我会

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
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.