【问题标题】:How to replace empty strings in a dataframe with NA (missing value) not NA string如何用 NA(缺失值)而不是 NA 字符串替换数据框中的空字符串
【发布时间】:2018-01-18 05:42:35
【问题描述】:

我有一个泰坦尼克号 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.

【问题讨论】:

    标签: r xlsx xls


    【解决方案1】:

    根据?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,而是可以指定为NA_real_NA_integer_NA_character_,具体取决于“船”的类型柱子。假设'boat'是character类,我们可能需要NA_character_

    titanic %>% 
           mutate(boat = if_else(boat=="", NA_character_ ,boat))
    

    【讨论】:

    • 我是 R 新手,你说的很管用。能否请您更详细地解释一下这三个是什么?现实中的 NA 没有任何价值,那为什么会有 3 种类型的 NA?
    • @shafeeqrahaman 我添加了更多信息。也可以查看?NA
    • @akrun 回答了隐含的问题,所以我只注意你也可以使用最后一个类敏感 ifelse 而不是 if_else a la: titanic %>% mutate(boat = ifelse(boat==" ", NA , 船))
    【解决方案2】:

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


    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的区别
    • 是的 - replace_with_na_at 允许您指定要影响的变量,并且还有一种不同的方式来描述您想用缺失值 (NA) 替换哪些内容。与 replace_with_na 相比 - 为此,您需要指定 list(variable = "value")。这看起来有点奇怪,但它是为使用 tidyr - replace_na 中的一些现有函数而构建的 - 遵循 list 的语法,以及 _at_all 和 @ 的特殊变体987654331@ 来自 dplyr 家族。如果您有任何问题,请告诉我!
    猜你喜欢
    • 2013-11-04
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多