r - 在字符串中出现多个模式时过滤R中的数据框
问题描述
数据
我有一个数据框,其中有一列由 R 中的字符串组成。
data <- structure(list(col = c("byr:1985 eyr:2021 iyr:2011 hgt:175cm pid:163069444 hcl:#18171d",
"eyr:2023 hcl:#cfa07d ecl:blu hgt:169cm pid:494407412 byr:1936",
"ecl:zzz eyr:2036 hgt:109 hcl:#623a2f iyr:1997 byr:2029 cid:169 pid:170290956",
"hcl:#18171d ecl:oth pid:266824158 hgt:168cm byr:1992 eyr:2021",
"byr:1932 ecl:hzl pid:284313291 iyr:2017 hcl:#efcc98 eyr:2024 hgt:184cm"
)), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"
))
问题
我想在包含以下模式/字段的行上过滤此数据框:
fields <- c("ecl", "eyr", "hgt", "hcl", "iyr", "byr", "pid")
换句话说,我想获得包含每个字段的行。
试图
包stringr
和str_detect
功能似乎是解决方案!因此,我在一个案例中对其进行了测试:
> data$col[1]
[1] "byr:1985 eyr:2021 iyr:2011 hgt:175cm pid:163069444 hcl:#18171d"
> str_detect(data$col[1], fields)
[1] FALSE TRUE TRUE TRUE TRUE TRUE TRUE
> all(str_detect(data$col[1], fields))
[1] FALSE
这行得通!如果字符串中不存在任何字段,则将其评估为假。
但是,当尝试使用此选项过滤行时:
data %>%
filter( all(str_detect(col, fields)) )
我最终得到一个空数据框和一个警告:
警告消息:在 stri_detect_regex(string, pattern, negate = negate, opts_regex = opts(pattern)) 中:较长的对象长度不是较短对象长度的倍数
问题)
- 是什么导致了这个警告?
- 如何在 R 中出现多个模式时过滤一列字符串?
解决方案
您收到警告的原因是因为向str_detect
量化函数意味着第一个值col
与 的第一个值匹配fields
,第二个值与第二个匹配,依此类推。长度col
为 5,长度fields
为 7,因此它们的长度不兼容,这就是警告的意思。
要过滤data
每个值fields
存在于基 R 中的行,您可以执行以下操作:
data[Reduce(`&`, lapply(fields, grepl, data$col)), ]
# col
# <chr>
#1 ecl:zzz eyr:2036 hgt:109 hcl:#623a2f iyr:1997 byr:2029 cid:169 pid:170290956
#2 byr:1932 ecl:hzl pid:284313291 iyr:2017 hcl:#efcc98 eyr:2024 hgt:184cm
如果您对tidyverse
答案感兴趣,可以将以上内容写为:
library(tidyverse)
data %>% filter(map(fields, ~str_detect(data$col, .x)) %>% reduce(`&`))
推荐阅读
- kubernetes - 使用网络策略将命名空间中的 pod 与其他命名空间隔离
- excel - 通过条件格式着色的单元格的 VBA
- ios - Ionic 4 IOS平台无需打开短信app即可发送短信
- c# - 尝试在 c# diffrenet 项目中删除循环依赖
- c# - 形成多维笛卡尔积数组
- export-to-csv - DVC - 进行预定的 csv 转储
- python - 无法使用请求继续解析下一页的名称
- javascript - 是否可以使用 resizeObserver (或类似的东西)来观察元素的顶部/左侧位置?
- php - Json 资源中的 Laravel 集合
- reactjs - 如何组织我的 React 组件和它们之间的数据流以避免“无法在未安装的组件上执行 React 状态更新”?