R 用不同列中的值替换数据帧中的NAs
我想用另一列中的值替换数据框中的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,
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
我该怎么做?我有一个包含许多列的大型数据框,因此找到一种高效的方法(我已经看到了)将是非常棒的。谢谢大家! dfnewdfnew可扩展选项:
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
中的df2coalesce
正是为了做到这一点(将第一个向量中的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)
之间没有区别,用那种方式使用它有什么理由?