考虑以下两个字符串的可变长度的两列数据帧:

library("tidyverse")

df <- tibble(REF = c("TTG", "CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT", "T", "TTGTGTGTGTGTGTGTGTGTGT"),
             ALT = c("T", "CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT,CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT", "TTG", "TTGTGTGTGTGTGTGTGTGTGTGT"))

# # A tibble: 4 × 2
# REF                               ALT                                                                
# <chr>                             <chr>                                                              
# 1 TTG                               T                                                                  
# 2 CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT,CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT
# 3 T                                 TTG                                                                
# 4 TTGTGTGTGTGTGTGTGTGTGT            TTGTGTGTGTGTGTGTGTGTGTGT  

与第REF列不同,第ALT列有时包含几个由逗号连接的字符串(例如第2行).

我想比较REF(REF_LEN)和ALT(ALT_LEN)中字符串的长度,并生成一个包含以下值的TYPE列:

  • REF_LENALT_LEN时的"SNM"
  • REF_LEN时为"INS"&lt;ALT_LEN
  • REF_LEN&gt;ALT_LEN

但我想这样做,当ALT中有几个字符串时,这个新TYPE列的输出也包含这些类型,并用逗号分隔.i、 例如,此处的预期输出为:

"DEL"     "INS,DEL" "INS"     "INS"

到目前为止,我知道如何在ALT中获得值的长度,但我无法折叠这些值,因为输出将包含表中所有ALT的长度,而不仅仅是成对的(即1,35,31,3,24):

df %>%
  dplyr::mutate(REF_LEN = str_length(REF),
                ALT_LEN = str_split(ALT, ","),
                ALT_LEN = purrr::map(ALT_LEN, str_length) %>% unlist() %>% paste(collapse = ","))

正如您所看到的,上面的代码不完整,但我也无法使用帮助函数在不同的方向上完成上面的TYPE列.这将返回许多错误,但不确定原因,因为它似乎可以很好地处理ALT_LEN中的值:

name <- function(alt_lens, ref_len) {
  alt_lens <- unlist(alt_lens)
  ifelse(alt_lens < ref_len, "DEL", ifelse(alt_lens > ref_len, "INS", "SNM"))
}

df %>%
  dplyr::mutate(REF_LEN = str_length(REF),
                ALT_LEN = str_split(ALT, ","),
                TYPE = purrr::map(ALT_LEN, str_length) %>% name(REF_LEN))

有什么 idea 吗?谢谢

推荐答案

Update:删除第一个答案.谢谢akrun给我指路!.概念是一样的:使用ncharcase_when,不同的是使用tidyr包中的separate_rows:

library(dplyr)
library(tidyr)

df %>% 
  mutate(id = row_number()) %>% 
  separate_rows(ALT, sep = ",") %>% 
  mutate(TYPE = case_when(nchar(REF)==nchar(ALT) ~ "SNM",
                             nchar(REF)< nchar(ALT) ~ "INS",
                             nchar(REF)> nchar(ALT) ~ "DEL",
                             TRUE ~ NA_character_)) %>% 
  group_by(id) %>% 
  mutate(TYPE = toString(TYPE)) %>% 
  slice(1)
 REF                               ALT                                    id TYPE    
  <chr>                             <chr>                               <int> <chr>   
1 TTG                               T                                       1 DEL     
2 CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT CGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGTGT     2 INS, DEL
3 T                                 TTG                                     3 INS     
4 TTGTGTGTGTGTGTGTGTGTGT            TTGTGTGTGTGTGTGTGTGTGTGT                4 INS  

R相关问答推荐

过滤矩阵以获得R中的唯一组合

工作流程_set带有Dplyrr风格的 Select 器,用于 Select 结果和预测因子R

pickerInput用于显示一条或多条geom_hline,这些线在图中具有不同 colored颜色

格点中指数、双曲和反双曲模型曲线的正确绘制

然后根据不同的列值有条件地执行函数

使用列/行匹配将两个不同维度的矩阵相加

使用data.table::fcase()而不是dplyr::case_When()时保持值

ComplexHEAT:使用COLUMN_SPLIT时忽略COLUMN_ORDER

在使用具有Bray-Curtis相似性的pvCluust时计算p值

优化从每个面的栅格中提取值

如何使用包metaviz更改标签的小数位数?

生存时间序列的逻辑检验

R:使用ApexCharge更改标签在饼图中的位置

Broom.Mixed::Augment不适用于Sample::分析

根据排名的顶点属性调整曲线图布局(&Q)

以R表示的NaN值的IS.NA状态

将CSV转换为R中的自定义JSON格式

R/shiny APP:如何充分利用窗口?

带有Bootswatch Cerulean主题的shiny 仪表板中的浏览&按钮可见性问题

对计算变量所有唯一值的变量进行变异