为何使用mutate结合replace_na未达预期效果?
问题:replace_na在mutate中为何替换整列而非仅NA元素?
问题现象
执行以下代码:
data.frame(a=c(TRUE,NA)) %>% mutate(a=replace_na(FALSE))
返回结果:
a 1 FALSE 2 FALSE
这段代码把整列都设置为FALSE,而非仅替换列中的NA元素,原因是什么?
原因分析
在mutate中调用replace_na时,你没有传入需要处理的目标向量(即列a)。replace_na的第一个参数是待处理的data,第二个参数才是用来替换NA的replace值。
你原本期望调用的是向量版本的replace_na,正确写法应该是把列a作为第一个参数传入:
df <- data.frame(a=c(TRUE,NA)) df$a <- replace_na(df$a, FALSE)
而你写的replace_na(FALSE),实际是把FALSE当作了第一个参数data,此时函数会直接返回这个值,导致mutate把整列a都赋值为FALSE。
官方文档说明
replace_na(data, replace)的文档明确指出:
如果data是向量,replace接受单个值,这个值会替换向量中所有缺失值,且replace会被转换为data的类型。
补充:正确的整列替换写法
如果你想直接在管道中处理数据框,也可以直接调用replace_na并传入列名对应的列表,这种写法可以正常工作:
data.frame(a=c(TRUE,NA)) %>% replace_na(list("a"=FALSE))
内容的提问来源于stack exchange,提问作者robertspierre
相关产品推荐
相关产品推荐

