R中的dplyr方法:将所有空因子替换为NA

5

这种方法不是通过编写和读取数据框来填充所有空因子的。

na.strings=c("","NA")

我希望能够对所有列应用一个函数,并将空值替换为NA。目前我已经选择了因子列,但不知道该怎么做下一步。

df %>% select_if(is.factor) %>% ....

我应该如何做到这一点,最好使用dplyr和/或apply方法进行处理。

请提供一些示例数据。 - neilfws
2
df %>% mutate_if(is.factor, na_if, '') - alistaire
2
@alistaire - 我需要执行以下操作:df %>% mutate_if(is.factor, na_if, y='') 才能使其正常工作。 - thelatemail
@thelatemail 嗯,在使用 rlang 的开发版时,它对我来说没有任何问题。不过命名参数更安全,我猜。 - alistaire
1个回答

8
我们可以使用mutate_if函数。
df <- df %>%
         mutate_if(is.factor, funs(factor(replace(., .=="", NA))))

使用 dplyr 0.8.0,我们也可以进行以下操作:

df %>% 
    mutate_if(is.factor, na_if, y = "") 

或者更改funs(如@Frederick在评论中提到的将被弃用为list

df %>%
   mutate_if(is.factor, list(~ na_if(., "")))

或者使用基本R,我们可以将特定的levels分配给NA

j1 <- sapply(df, is.factor)
df[j1] <- lapply(df[j1], function(x) {is.na(x) <- levels(x)==""; x})

数据

df <- data.frame(col1 = c("", "A", "B", ""), col2 = c("A", "", "", "C"),
         col3 = 1:4)

1
从dplyr 0.8.0开始,第一个替代方案应该是:df <- df %>% mutate_if(is.factor, list(~factor(replace(., .=="", NA)))) - Frederick
2
@Frederick 谢谢您的通知,我已经更新了。我使用了 na_if 来使它更短。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接