如何将数据框中的空字符串替换为NA(缺失值),而不是NA字符串

5
我有一个巨大的xlsx文件,里面有很多空白单元格,我将其保存为csv格式时所有的空白都保留了下来。
当我导入csv文件后,数据集中出现了很多空字符串/空白单元格,其中一个列是“boat”。
我可以使用readxl包的函数(如read_xls或read_xlsx)直接将空字符串替换为NA,但我想知道是否有一种方法可以在将数据加载到R数据框之后再替换空字符串。
我尝试了以下方法,但它抛出了错误,我并不完全理解。我可以在下面的代码中指定NA为“NA”,然后它就会被替换为NA,但那将是字符串(NA),而不是缺失值NA,两者是不同的。
titanic %>% mutate(boat = if_else(boat=="", NA ,boat))

Error in mutate_impl(.data, dots) : 
Evaluation error: `false` must be type logical, not character.
2个回答

3

根据 ?NA 的说明,仅指定NA即可,"NA是一个包含缺失值的长度为1的逻辑常量。"

可以检查class

class(NA)
#[1] "logical"
class(NA_character_) 
#[1] "character"

两者都可以使用标准函数(例如 is.na)进行识别。

is.na(NA)
#[1] TRUE
is.na(NA_character_)
#[1] TRUE
if_else 是类型敏感的函数,所以不能只将参数指定为 NA,因为这会返回一个逻辑值。而应根据 "boat" 列的类型,分别将参数指定为 NA_real_, NA_integer_, NA_character_。假设 "boat" 的类型是 character,我们需要用到 NA_character_
titanic %>% 
       mutate(boat = if_else(boat=="", NA_character_ ,boat))

我对R不太熟悉,但你说的方法起作用了。能否请您详细解释一下这三个是什么?实际上NA没有任何值,那为什么会有三种类型的NA呢? - cyborg
@shafeeqrahaman 我添加了更多信息。你也可以查看?NA - akrun
@akrun已经回答了隐含的问题,所以我只想指出你也可以使用最后一个class-sensitive ifelse而不是if_else,例如: titanic%>% mutate(boat = ifelse(boat ==“”,NA,boat)) - Rick Pack

1

您可以使用naniar包将指定的值替换为NA。 - http://naniar.njtierney.com/


df <- data.frame(boat = c(1, 2, "", 3), category = c("a", "b", "c", "d"))


df
#>   boat category
#> 1    1        a
#> 2    2        b
#> 3             c
#> 4    3        d
library(naniar)

df %>% replace_with_na(replace = list(boat = ""))
#>   boat category
#> 1    1        a
#> 2    2        b
#> 3 <NA>        c
#> 4    3        d

# You can also specify how to do this for a specific, using the development
# version - devtools::install_github('njtierney/naniar')
df %>% replace_with_na_at(.vars = "boat", ~.x == "")
#>   boat category
#> 1    2        a
#> 2    3        b
#> 3   NA        c
#> 4    4        d

如果您需要任何澄清,请告诉我!


你能解释一下 replace_with_na 和 replace_with_na_at 之间的区别吗? - cyborg
是的 - replace_with_na_at 允许您指定要影响的变量,并且有一种不同的方式来描述您想要用缺失值(NA)替换的内容。与 replace_with_na 相比 - 要使其工作,您需要指定 list(variable = "value")。这似乎有点奇怪,但它是为了与 tidyr 中的一些现有函数 - replace_na - 以及 dplyr 家族的 _at_all_if 的特殊变体遵循 list 语法而构建的。如果您有任何问题,请告诉我! - Nick Tierney

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