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

时间:2020-08-18 20:22:51

标签: r dplyr

我有兴趣用同一行的参考值替换一行中的所有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行。

有什么建议吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这也可以工作:

library(dplyr)

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

输出:

  ref var1 var2
1   1    1    1
2   3    3    3
3   4    4    4
4   2    2    5
5   5    1    5
相关问题