繁体   English   中英

dplyr 的 rowwise + replace_NAs:用其他列的值替换多列中的 NA

[英]dplyr's rowwise + replace_NAs: replacing NAs in multiple columns with value from other column

我有兴趣用同一行的参考值替换一行中的所有 NA。 以下代码有效,但对于我的实际用例来说太慢了:

df = data.frame(ref = c(1,3,4,2,5), var1 = c(NA,3,4,2,1), var2 = c(1,3,NA,5,5))
for (i in 1:nrow(df)) {
  ref_value = as.character(df$ref[i])
  df[i,] = df[i,] %>% mutate_all(replace_na, replace = ref_value) }

我尝试通过以下修改加快该过程,并得到以下错误。

df = data.frame(ref = c(1,3,4,2,5), var1 = c(NA,3,4,2,1), var2 = c(1,3,NA,5,5))
df %>% rowwise() %>% mutate_all(replace_na, replace = ref)

错误:

错误: mutate()输入ref有问题。 x 替换data的长度是 2,而不是长度 1 ℹ 输入ref(function (data, replace, ...)... . ℹ 第 1 行出现错误。

有什么建议么?

我们可以使用coalesce 循环遍历 'var' 列并使用循环列和 'ref' 的coalesce ,这样无论哪里有NA ,它都会被 'ref' 中的相应元素替换,而其他非 NA 元素保持原样

library(dplyr) #>= 1.0.0
df %>% 
     mutate(across(starts_with('var'), ~ coalesce(., ref)))
#   ref var1 var2
#1   1    1    1
#2   3    3    3
#3   4    4    4
#4   2    2    5
#5   5    1    5

这也可以:

library(dplyr)

df %>%
  mutate(across(c(var1:var2),~ ifelse(is.na(.), ref, .)))

Output:

  ref var1 var2
1   1    1    1
2   3    3    3
3   4    4    4
4   2    2    5
5   5    1    5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM