首页 > 解决方案 > 如果找到特定字符,则用 NA 替换整个值

问题描述

如果在当前值中找到特定字符,我想用 NA 替换特定行中的值,fe 如果值包含“<”(低于),fe “<7.5”我想用 NA 替换整个值.

例子:

Column A: 3, 4, 8, <5.6, 1, 3
Column B: 7, 4, <6, 1, <2.2, 8

应转换为:

Column A: 3, 4, 8, NA, 1, 3
Column B: 7, 4, NA, 1, NA, 8

我在这里找到了这个例子(https://dplyr.tidyverse.org/reference/na_if.html)与mutate和na_if(),但它需要匹配整个字符串fe

y <- c("abc", "def", "", "ghi")
na_if(y, "def")

所以“def”将被 NA 取代。但是如果我使用

y <- c("abc", "def", "", "ghi")
na_if(y, "ef")

什么都没有被替换。还有一个例子

library(dplyr)
data <- starwars
data %>%
  select(name, eye_color) %>%
  mutate(name = na_if(name, "Luke Skywalker")) %>% 
  mutate(eye_color = na_if(eye_color, "unknown")) -> dataedited

这段代码对我来说很完美,但也需要完全匹配,而不仅仅是字符串的一部分。这样我可以手动编辑每一列,也许有一种方法可以跨多列执行此操作。如果名称包含“sky”或 eye 包含“unkn”,我想将值转换为 NA。

谁能帮我?

谢谢!

标签: rna

解决方案


na_if不会在y. 我们可以创建一个逻辑向量replace来将值替换为NA。对于多列,使用across

library(dplyr)
data <- data %>%
   mutate(across(c(name, eye_color),
       ~ replace(.,  . %in% c("Luke Skywalker", "unknown"), NA)))

对于部分匹配,使用regexinstr_detectgrepl

library(stringr)
data <- data %>%
    mutate(across(c(name, eye_color),
       ~ replace(.,   str_detect(., "sky|unkn"), NA)))

推荐阅读