根据R中字符串中不同位置的不同条件进行筛选



字符串的中间部分是ID,我希望每个ID只出现一次;07〃;而不是";08〃;,或";A";而不是";B";。如果数字是"0",我想完全排除;02";。除此之外,如果ID只有一次出现,我想保留它。所以,如果我有:

col1                       
ID-1-AMBCFG-07A-01
ID-1-CGUMBD-08A-01
ID-1-XDUMNG-07B-01
ID-1-XDUMNG-08B-01
ID-1-LOFBUM-02A-01
ID-1-ABYEMJ-08A-01  
ID-1-ABYEMJ-08B-01    

那么我想要:

col1
ID-1-AMBCFG-07A-01
ID-1-CGUMBD-08A-01
ID-1-XDUMNG-07B-01
ID-1-ABYEMJ-08A-01  

我想也许我可以使用group_by来指定6个字母的ID,然后使用某种if_else语句?但是我不知道如何指定字符串中字符的位置。非常感谢您的帮助!

使用extract和一些dplyr争吵:

library(tidyr)
library(dplyr)
df %>% 
extract(col1, "ID-\d-(.*)-(\d*)(A|B)-01",
into = c("ID", "number", "letter"),
remove = FALSE, convert = TRUE) %>% 
group_by(ID) %>% 
filter(number != 2) %>% 
slice_min(n = 1, order(number, letter)) %>%
ungroup() %>% 
select(col1)
#                col1                        
#1 ID-1-ABYEMJ-08A-01
#2 ID-1-AMBCFG-07A-01
#3 ID-1-CGUMBD-08A-01
#4 ID-1-XDUMNG-07B-01

带有str_detect的选项

library(stringr)
library(dplyr)
df1 %>% 
group_by(ID = str_extract(col1, "ID-\d+-\w+")) %>% 
filter(str_detect(col1, "02", negate = TRUE), row_number() == 1) %>%
ungroup %>% 
select(-ID)

-输出

# A tibble: 4 × 1
col1              
<chr>             
1 ID-1-AMBCFG-07A-01
2 ID-1-CGUMBD-08A-01
3 ID-1-XDUMNG-07B-01
4 ID-1-ABYEMJ-08A-01

数据

df1 <- structure(list(col1 = c("ID-1-AMBCFG-07A-01", "ID-1-CGUMBD-08A-01", 
"ID-1-XDUMNG-07B-01", "ID-1-XDUMNG-08B-01", "ID-1-LOFBUM-02A-01", 
"ID-1-ABYEMJ-08A-01", "ID-1-ABYEMJ-08B-01")), class = "data.frame", 
row.names = c(NA, 
-7L))

最新更新