R 用不同列中的值替换数据帧中的NAs

R 用不同列中的值替换数据帧中的NAs,r,R,我想用另一列中的值替换数据框中的NAs。例如: a1 <- c(1, 2, 4, NA, 2, NA) b1 <- c(3, NA, 4, 4, 4, 3) c1 <- c(NA, 3, 3, 4, 2, 3) a2 <- c(2, 3, 5, 5, 3, 4) b2 <- c(1, 2, 4, 5, 6, 3) c2 <- c(3, 3, 2, 3, 4, 3) df <- as.data.frame(cbind(a1, b1, c1, a2, b2,

我想用另一列中的值替换数据框中的NAs。例如:

a1 <- c(1, 2, 4, NA, 2, NA)
b1 <- c(3, NA, 4, 4, 4, 3)
c1 <- c(NA, 3, 3, 4, 2, 3)
a2 <- c(2, 3, 5, 5, 3, 4)
b2 <- c(1, 2, 4, 5, 6, 3)
c2 <- c(3, 3, 2, 3, 4, 3)
df <- as.data.frame(cbind(a1, b1, c1, a2, b2, c2))
df
> df
  a1 b1 c1 a2 b2 c2
1  1  3 NA  2  1  3
2  2 NA  3  3  2  3
3  4  4  3  5  4  2
4 NA  4  4  5  5  3
5  2  4  2  3  6  4
6 NA  3  3  4  3  3
我该怎么做?我有一个包含许多列的大型数据框,因此找到一种高效的方法(我已经看到了)将是非常棒的。谢谢大家!

dfnew
dfnew可扩展选项:

df2 <- df[c('a1','b1','c1')]
df2[] <- mapply(function(x,y) ifelse(is.na(x), y, x),
                df[c('a1','b1','c1')], df[c('a2','b2','c2')],
                SIMPLIFY=FALSE)
df2
#   a1 b1 c1
# 1  1  3  3
# 2  2  2  3
# 3  4  4  3
# 4  5  4  4
# 5  2  4  2
# 6  4  3  3
df2可扩展选项:

df2 <- df[c('a1','b1','c1')]
df2[] <- mapply(function(x,y) ifelse(is.na(x), y, x),
                df[c('a1','b1','c1')], df[c('a2','b2','c2')],
                SIMPLIFY=FALSE)
df2
#   a1 b1 c1
# 1  1  3  3
# 2  2  2  3
# 3  4  4  3
# 4  5  4  4
# 5  2  4  2
# 6  4  3  3

dplyr
中的
df2
coalesce
正是为了做到这一点(将第一个向量中的NAs替换为后一个向量中的NA元素)。e、 g

它可以与sapply一起使用,以高效且易于扩展的方式处理整个数据集:

sapply(c("a","b","c"),function(x) coalesce(df[,paste0(x,1)],df[,paste0(x,2)]))
     a b c
[1,] 1 3 3
[2,] 2 2 3
[3,] 4 4 3
[4,] 5 4 4
[5,] 2 4 2
[6,] 4 3 3

dplyr
中的
coalesce
正是为了做到这一点(将第一个向量中的NAs替换为后一个向量中的NA元素)。e、 g

它可以与sapply一起使用,以高效且易于扩展的方式处理整个数据集:

sapply(c("a","b","c"),function(x) coalesce(df[,paste0(x,1)],df[,paste0(x,2)]))
     a b c
[1,] 1 3 3
[2,] 2 2 3
[3,] 4 4 3
[4,] 5 4 4
[5,] 2 4 2
[6,] 4 3 3

您可以使用
hutils::coalesce
。它应该稍微快一点,特别是如果它可以“作弊”——如果任何列没有
NA
s,因此不需要更改,
coalesce
将跳过它们:


a1您可以使用
hutils::coalesce
。它应该稍微快一点,特别是如果它可以“作弊”——如果任何列没有
NA
s,因此不需要更改,
coalesce
将跳过它们:


a1在
is.na(df$a1)==T
is.na(df$a1)
之间没有区别,用那种方式使用它有什么理由?在
is.na(df$a1)==T
is.na(df$a1)
之间没有区别,用那种方式使用它有什么理由?