提问人:Josh 提问时间:10/7/2023 最后编辑:zephrylJosh 更新时间:10/7/2023 访问量:53
如何在 R 中筛选各种字符串模式中的行
How to filter rows from various string patterns in R
问:
我有一个大的数据帧,其中有一列带有数字和字母代码。像这样的东西:
编号 | death_cause |
---|---|
1 | K703型 |
2 | N19X系列 |
3 | 编号:C069 |
4 | C07X型 |
5 | D181型 |
6 | R99X系列 |
7 | D371型 |
8 | E117型 |
9 | D489型 |
10 | D500型 |
我需要过滤并保留所有以字母 C 开头的代码和以字母 D 开头的代码,但只有 0 到 48 之间的数字(即 D00、D10、D20、D48),不再需要从 D49 开始的数据。
我已经设法过滤掉了字母 C 代码,因为很容易要求将字符保留以字母 C 开头的字符,并带有 dplyr 和 stringr。
df_filtered <- df %>%
filter(str_detect(death_cause, "^C"))
但是,我还需要保留特定的 D 代码。 我的一个想法是创建一个带有 D 代码字符的向量
D_codes <- paste("D", 00:48, sep = "")
我的问题是如何使用 dplyr 和 stringr(通常是 tidyverse)函数过滤 C 代码旁边的其他字符模式。
我试过了:
df_filtered <- df %>%
filter(str_detect(death_cause, "^C") | str_detect(death_cause, D_codes ) )
你能给我的任何帮助,我将不胜感激。
答:
0赞
zephryl
10/7/2023
#1
你走在正确的轨道上。您需要填充 D 代码的个位数字:
library(stringr)
library(dplyr)
D_codes <- str_c("D", str_pad(0:48, 2, pad = "0"))
并且只是使用而不是:%in%
str_detect()
df %>%
filter(str_starts(death_cause, "C") | death_cause %in% D_codes))
(另请注意,在这种情况下,作为替代方法。str_starts()
str_detect()
评论
df %>% filter(grepl("^C|^D", death_cause), death_cause < "D49")
df %>% filter(str_detect(death_cause,'^[C|D]') & between(as.numeric(str_remove_all(death_cause,'\\D')),0,48))