R - 仅识别列中以 A 和 B 结尾的字符串

R - Identifying only strings ending with A and B in a column

我在 R 的数据框中有一列包含样本名称。有些名字是相同的,只是它们最后以 A 或 B 结尾,有些样本重复自己,像这样:

df <- data.frame(Samples = c("S_026A", "S_026B", "S_028A", "S_028B", "S_038A", "S_040_B", "S_026B", "S_38A"))

我想做的是隔离所有结尾有 A 和 B 的样本名称,而不包括只有 A 或 B 的样本名称。

我正在寻找的最终结果如下所示: “S_026”和“S_028”,因为它们是仅有的以 A 和 B 结尾的。

我似乎找到的只是如何删除重复项,在这种情况下,删除重复项只会给我“S_026B”和“S_38A”。

或者,我尝试去掉末尾的 A 和 B,然后将这些名称中的每一个的总和 > 2 的次数相加,但同样,这并没有给我想要的结果。

有什么建议吗?

我们可以用substring获取子串分组后的最后一个字符不包括最后一个字符,并检查子串中是否同时存在'A'和'B'

library(dplyr)
df %>% 
   group_by(grp = substr(Samples, 1, nchar(Samples)-1)) %>% 
   filter(all(c("A", "B") %in% substring(Samples, nchar(Samples)))) %>% 
   ungroup %>% 
   select(-grp)

-输出

# A tibble: 5 x 1
  Samples
  <chr>  
1 S_026A 
2 S_026B 
3 S_028A 
4 S_028B 
5 S_026B 

您可以提取不同列中 Sample 的最后一个字符,只保留那些同时具有 'A''B' 的值,并且只保留唯一值。

library(dplyr)
library(tidyr)

df %>%
  extract(Samples, c('value', 'last'), '(.*)(.)') %>%
  group_by(value) %>%
  filter(all(c('A', 'B') %in% last)) %>%
  ungroup %>%
  distinct(value)

#  value
#  <chr>
#1 S_026
#2 S_028