【问题标题】:R - Identifying only strings ending with A and B in a columnR - 仅识别列中以 A 和 B 结尾的字符串
【发布时间】:2021-10-12 05:49:42
【问题描述】:

我在 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 的次数相加,但同样,这并没有给我想要的结果。

有什么建议吗?

【问题讨论】:

    标签: r sample replicate


    【解决方案1】:

    我们可以使用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 
    

    【讨论】:

    • 非常感谢 - 你为我节省了很多时间。但是,我可能会补充说 S_026B 出现了两次。这也发生在我的数据上。为了解决这个问题,我在代码末尾使用sort(unique(Samples)) 来获取最后同时出现 A 和 B 的代码。
    • 但是,有没有办法只得到 S_026 和 S_028 的答案,而不是只得到 A 和 B 的列表?
    • @Purrsia 只需删除select(-grp) 并使用%&gt;% distinct(grp)
    【解决方案2】:

    您可以在不同列中从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
    

    【讨论】:

    • 非常感谢。这非常有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多