r - 如果找到特定字符,则用 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。
谁能帮我?
谢谢!
解决方案
na_if
不会在y
. 我们可以创建一个逻辑向量replace
来将值替换为NA
。对于多列,使用across
library(dplyr)
data <- data %>%
mutate(across(c(name, eye_color),
~ replace(., . %in% c("Luke Skywalker", "unknown"), NA)))
对于部分匹配,使用regex
instr_detect
或grepl
library(stringr)
data <- data %>%
mutate(across(c(name, eye_color),
~ replace(., str_detect(., "sky|unkn"), NA)))
推荐阅读
- ionic-framework - 我们如何显示在 ionic 2 中打开的默认轮日期选择器
- c# - 为什么不应该混合使用 IQueryable 和 IEnumerable 查询?
- marklogic - 搜索响应顺序
- xamarin.android - Webview 无法加载 https URL Xamarin Droid
- slack - 如果对于直接消息通道,为什么 chat.postEphemeral 返回错误 channel_not_found?
- asp.net - 为什么使用单个 HTTPClient,而不是为每个请求创建一个新客户端,会大大降低我的 API 速度?
- python - 如何从彩色地图中提取土地?
- c# - 如何使用带有 ASP.NET MVC 的实体框架将外键作为空值保存在数据库中?
- c - 手工编码的日志功能不会找到超过 10 的以 10 为基础的日志
- unity3d - arcore,统一放置3D模型,无需触摸