[英]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.