让我们假设我有:

> w
   digest    gene          seq
1     InS  AB0583          AAB
2     InS  AB0583        AABKR
3     InS  AB0583      GFHGHGG
4     PAC PU83022          EUT
5     PAC PU83022      HSFSFJF
6     PAC PU83022        EUTCK
7     PAC PU83022       EUTCKJ
8     InS PO93853         HDGJ
9     InS PO93853        HDGJU
10    InS PO93853       YTYEYD
11    InS PO93853 YTYEYDJHSGSG
12    InS PO93853   SALGHAGGEE

我应用了两种不同的方法来识别蛋白质(用它们的基因名称w$gene进行解码).这些方法在w$digest中被编码.如您所见,在每个w$digest内的每个w$gene内可能存在w$seq的重叠序列--例如,EUT也在EUTCK内,即在EUTCKJ内.

我想知道有多少独特的氨基酸,每w$seq个字母中的一个,被识别出来.因此,我需要删除在另一个字符串中检测到的任何/所有字符串(S),但仅当grouped_by(digest, gene).应保留字符最多的字符串.

我要在tidyverse分钟内找到解决方案

Help need:

(1)统计字数,排列如下:

w <- w %>%
  mutate(count = str_count(seq)) %>%
  arrange(digest, gene, count)

所以

> w
   digest    gene          seq count
1     InS  AB0583          AAB     3
2     InS  AB0583        AABKR     5
3     InS  AB0583      GFHGHGG     7
4     InS PO93853         HDGJ     4
5     InS PO93853        HDGJU     5
6     InS PO93853       YTYEYD     6

(2)group_by(digest, gene)行,现在remove行包含在另一个w$seq中检测到的w$seq(在该分组内),并保留w$seq具有最多字符的行.

Output

> w
   digest    gene          seq count
1     InS  AB0583          AAB     3 #* found within:
2     InS  AB0583        AABKR     5 #*
3     InS  AB0583      GFHGHGG     7
4     InS PO93853         HDGJ     4 #** found within:
5     InS PO93853        HDGJU     5 #**
6     InS PO93853       YTYEYD     6 #***
7     InS PO93853   SALGHAGGEE    10
8     InS PO93853 YTYEYDJHSGSG    12 #***
9     PAC PU83022          EUT     3 #****
10    PAC PU83022        EUTCK     5 #****
11    PAC PU83022       EUTCKJ     6 #****
12    PAC PU83022      HSFSFJF     7

因此,Expected output

> w
   digest    gene          seq count
1     InS  AB0583        AABKR     5 
2     InS  AB0583      GFHGHGG     7
3     InS PO93853        HDGJU     5 
4     InS PO93853   SALGHAGGEE    10
5     InS PO93853 YTYEYDJHSGSG    12 
6     PAC PU83022       EUTCKJ     6 
7     PAC PU83022      HSFSFJF     7

Data

w <- data.frame(
  digest = c(rep("InS", 3), rep("PAC", 4), rep("InS", 5)),
  gene = c(rep("AB0583", 3), rep("PU83022", 4), rep("PO93853", 5)),
  seq = c("AAB", "AABKR", "GFHGHGG",
          "EUT", "HSFSFJF", "EUTCK", "EUTCKJ",
          "HDGJ", "HDGJU", "YTYEYD", "YTYEYDJHSGSG", "SALGHAGGEE")
)

推荐答案

对于group_by()中的每个组,您可以创建一个新的列表列,其中每一行都包含该组的所有seq个值.然后,您可以执行逐行操作,计算每个值seq在所有值中出现的次数.保留那些只出现一次的会给你想要的结果.

library(dplyr)
library(stringr)
w <- data.frame(
  digest = c(rep("InS", 3), rep("PAC", 4), rep("InS", 5)),
  gene = c(rep("AB0583", 3), rep("PU83022", 4), rep("PO93853", 5)),
  seq = c("AAB", "AABKR", "GFHGHGG",
          "EUT", "HSFSFJF", "EUTCK", "EUTCKJ",
          "HDGJ", "HDGJU", "YTYEYD", "YTYEYDJHSGSG", "SALGHAGGEE")
)

w <- w %>%
  mutate(count = str_count(seq)) %>%
  arrange(digest, gene, count) 

w %>% group_by(digest, gene) %>%
  mutate(all_vals = list(seq)) %>% 
  rowwise() %>% 
  mutate(win = sum(grepl(seq, all_vals))) %>% 
  filter(win == 1) %>% 
  dplyr::select(-c(win, all_vals))
#> # A tibble: 7 × 4
#> # Rowwise:  digest, gene
#>   digest gene    seq          count
#>   <chr>  <chr>   <chr>        <int>
#> 1 InS    AB0583  AABKR            5
#> 2 InS    AB0583  GFHGHGG          7
#> 3 InS    PO93853 HDGJU            5
#> 4 InS    PO93853 SALGHAGGEE      10
#> 5 InS    PO93853 YTYEYDJHSGSG    12
#> 6 PAC    PU83022 EUTCKJ           6
#> 7 PAC    PU83022 HSFSFJF          7

创建于2023-05-25,共reprex v2.0.2

R相关问答推荐

如何将y轴上的线定位得彼此更近

根据列表中项目的名称多次合并数据框和列表

基于现有类创建类的打印方法(即,打印tibles更长时间)

咕噜中的元素列表:map

如何在xyplot中 for each 面板打印R^2

用derrr在R中查找组间的重复项

如何删除gggvenn与gggplot绘制的空白?

在另存为PNG之前隐藏htmlwidget绘图元素

如何得到每四个元素向量R?

如何同时从多个列表中获取名字?

如何在分组条形图中移动相关列?

使用`Watch()`和`renderUI()`时,不再满足仍出现在SHILINY AFTER条件中的条件输入

您是否可以将组添加到堆叠的柱状图

悬崖三角洲超大型群数计算导致整数溢出

基于数据集属性将科分配给物种

使用来自嵌套列和非嵌套列的输入的PURRR:MAP和dplyr::Mariate

计算Mean by分组和绑定到R中的数据集

如何在使用因子时获得Sankey图的Scale_Fill_Viridis的全范围

如何将宽格式的患者信息数据高效地转换为患者计数的时间序列?

按镜像列值自定义行顺序