如何在 R 中筛选各种字符串模式中的行

How to filter rows from various string patterns in R

提问人:Josh 提问时间:10/7/2023 最后编辑:zephrylJosh 更新时间:10/7/2023 访问量:53

问:

我有一个大的数据帧,其中有一列带有数字和字母代码。像这样的东西:

编号 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 ) )

你能给我的任何帮助,我将不胜感激。

R dplyr 纵梁

评论

2赞 Ritchie Sacramento 10/7/2023
我想你也许可以侥幸逃脱.df %>% filter(grepl("^C|^D", death_cause), death_cause < "D49")
0赞 jkatam 10/7/2023
或者df %>% filter(str_detect(death_cause,'^[C|D]') & between(as.numeric(str_remove_all(death_cause,'\\D')),0,48))

答:

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()