【问题标题】:How to replace certain strings with NA, na_if, if_else, regex如何用 NA、na_if、if_else、regex 替换某些字符串
【发布时间】:2022-07-15 22:54:54
【问题描述】:

我有一个字符变量,它有一些值我想用 NA 替换(例如“N/A”;“NA”作为文本输入,而不是 R 的 NA 类型;其他文本响应。)我不想要的值替换为 NA 包含数字字符串,所以我尝试使用正则表达式选择非数字字符串替换为 NA。

我可以使用以下内容过滤非数字案例,或者如果我删除“!”,则可以过滤数字字符串案例。我一直无法弄清楚如何将 mutate() 与 if_else() 和 str_detect() 或 na_if() 与 str_detect() 一起使用来替换这些情况。如果我用 na_if() 准确指定它们,我只能替换它们。

library(dplyr)
library(stringr)

df <- data.frame(var1 = c("84950", "NA", "N/A", "84596/03456", "55555", NA), 
                 var2 = rep("10000", 6))

df %>% 
  filter(!str_detect(var1, "[:digit:]"))

这不起作用。

df %>% 
mutate(var1 = if_else(str_detect(var1, "[:digit:]"), var1, NA))

这不起作用,保留所有情况。

df %>% 
  mutate(var1 = na_if(var1, !str_detect(var1, "[:digit:]"))) 

这可以替换这个特定值“N/A”

df %>% 
  mutate(var1 = na_if(var1, "N/A"))

【问题讨论】:

    标签: r dplyr stringr


    【解决方案1】:

    您的第二种方法很接近。您需要指定 NA 是一种字符类型。

    df %>% 
    +     mutate(var1 = if_else(str_detect(var1, "[:digit:]"), var1, NA_character_))
    

    输出:

             var1  var2
    1       84950 10000
    2        <NA> 10000
    3        <NA> 10000
    4 84596/03456 10000
    5       55555 10000
    6        <NA> 10000
    

    【讨论】:

      猜你喜欢
      • 2019-11-17
      • 2023-03-04
      • 2021-10-24
      • 2018-08-23
      • 1970-01-01
      • 2014-10-09
      • 2012-03-30
      • 1970-01-01
      • 2011-12-31
      相关资源
      最近更新 更多