我有兴趣用同一行的参考值替换一行中的所有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行。
有什么建议吗?
答案 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