r-如果一列为NA,则使用dplyR计算其他列的行平均值



在下面的例子中,当列A为NA时,我如何计算行平均值?行平均值将取代A列中的NA。使用基数R,我可以使用这个:

foo <- tibble(A = c(3,5,NA,6,NA,7,NA),
B = c(4,5,4,5,6,4,NA),
C = c(6,5,2,8,8,5,NA))
foo
tmp <- rowMeans(foo[,-1],na.rm = TRUE)
foo$A[is.na(foo$A)] <- tmp[is.na(foo$A)]
foo$A[is.nan(foo$A)] <- NA

想知道我怎么能用dplyR做到这一点吗?

您可以使用ifelse:

library(dplyr)
foo %>% 
mutate(A = ifelse(is.na(A), rowMeans(., na.rm = TRUE), A), 
A = replace(A, is.nan(A), NA))
#      A     B     C
#  <dbl> <dbl> <dbl>
#1     3     4     6
#2     5     5     5
#3     3     4     2
#4     6     5     8
#5     7     6     8
#6     7     4     5
#7    NA    NA    NA

这里有一个解决方案,不仅可以替换a列中的NA,还可以替换数据帧中的所有列。

library(dplyr)
foo2 <- foo %>%
mutate(RowMean = rowMeans(., na.rm = TRUE)) %>%
mutate(across(-RowMean, .fns = 
function(x) ifelse(is.na(x) & !is.nan(RowMean), RowMean, x))) %>%
select(-RowMean)

使用coalesce:

foo %>%
mutate(m = rowMeans(across(), na.rm = T),
A = if_else(is.na(A) & !is.na(m), m, A)) %>%
select(-m)
# # A tibble: 7 x 3
#       A     B     C
#   <dbl> <dbl> <dbl>
# 1     3     4     6
# 2     5     5     5
# 3     3     4     2
# 4     6     5     8
# 5     7     6     8
# 6     7     4     5
# 7    NA    NA    NA

相关内容

  • 没有找到相关文章

最新更新