(tidyverse)按组为给定位置的列中的每个字符串提取子字符串,以包括
我有一个DNA比对的数据框。每个比对都有一个标签,可以由3个或更多分离物组成。我的目标是对对齐列进行变异,使其消除每个对齐中隔离1、3和4中所有间隙(以“-”号表示)的位置。所有路线中始终包含隔离体1、3和4,有时只有这三个将位于路线中 我所拥有的:(tidyverse)按组为给定位置的列中的每个字符串提取子字符串,以包括,r,tidyverse,R,Tidyverse,我有一个DNA比对的数据框。每个比对都有一个标签,可以由3个或更多分离物组成。我的目标是对对齐列进行变异,使其消除每个对齐中隔离1、3和4中所有间隙(以“-”号表示)的位置。所有路线中始终包含隔离体1、3和4,有时只有这三个将位于路线中 我所拥有的: test_df <- data.frame(isolate=c(1,2,3,4,1,2,3,4,5),label=c(1,1,1,1,2,2,2,2,2),alignment=c("--atc-a","at----a","--ataga","
test_df <- data.frame(isolate=c(1,2,3,4,1,2,3,4,5),label=c(1,1,1,1,2,2,2,2,2),alignment=c("--atc-a","at----a","--ataga","--attga","a---ggg","acgttgg","a---tgg","a---tgg", "aggatgg"))
> test_df
isolate label alignment
1 1 1 --atc-a
2 2 1 at----a
3 3 1 --ataga
4 4 1 --attga
5 1 2 a---ggg
6 2 2 acgttgg
7 3 2 a---tgg
8 4 2 a---tgg
9 5 2 aggatgg
> test_df
isolate label alignment
1 1 1 atc-a
2 2 1 ----a
3 3 1 ataga
4 4 1 attga
5 1 2 aggg
6 2 2 atgg
7 3 2 atgg
8 4 2 atgg
9 5 2 atgg
我所尝试的:
test_df <- data.frame(isolate=c(1,2,3,4,1,2,3,4,5),label=c(1,1,1,1,2,2,2,2,2),alignment=c("--atc-a","at----a","--ataga","--attga","a---ggg","acgttgg","a---tgg","a---tgg", "aggatgg"))
> test_df
isolate label alignment
1 1 1 --atc-a
2 2 1 at----a
3 3 1 --ataga
4 4 1 --attga
5 1 2 a---ggg
6 2 2 acgttgg
7 3 2 a---tgg
8 4 2 a---tgg
9 5 2 aggatgg
> test_df
isolate label alignment
1 1 1 atc-a
2 2 1 ----a
3 3 1 ataga
4 4 1 attga
5 1 2 aggg
6 2 2 atgg
7 3 2 atgg
8 4 2 atgg
9 5 2 atgg
我可以获得我希望为每条路线保留的站点列表,如下所示:
library(tidyverse)
library(stringr)
test_df %>%
mutate(positions=str_locate_all(alignment, "[^-]")) %>%
group_by(label) %>%
filter(isolate %in% c(1,3,4)) %>%
summarise(pos_to_keep=list(unique(unlist(Reduce(rbind, positions)))))
但是我不确定如何继续分割所有的路线。这是我可以得到您的解决方案的一种方法。也许有更快的办法
library(dplyr)
test_df <- data.frame(isolate=c(1,2,3,4,1,2,3,4,5),label=c(1,1,1,1,2,2,2,2,2),alignment=c("--atc-a","at----a","--ataga","--attga","a---ggg","acgttgg","a---tgg","a---tgg", "aggatgg"),stringsAsFactors = FALSE)
# Get the correct positions
labelGroups <- test_df %>% mutate(positions=(str_locate_all(alignment, "[^-]"))) %>% filter(isolate %in% c(1,3,4)) %>% group_by(label) %>% summarise(pos_to_keep=list(unique(sort(unlist(positions)))))
# Make a function to extract the relevant letters
getletters <- function(wordlist,indexlist){n <- length(indexlist);lapply(1:n,function(i) paste0(sapply(indexlist[[i]], function(x) substr(wordlist[i],x,x)),collapse=""))}
# Try it
test_df %>% left_join(labelGroups,by="label") %>% mutate(newAlignment=getletters(alignment,pos_to_keep))
# isolate label alignment pos_to_keep newAlignment
# 1 1 1 --atc-a 3, 4, 5, 6, 7 atc-a
# 2 2 1 at----a 3, 4, 5, 6, 7 ----a
# 3 3 1 --ataga 3, 4, 5, 6, 7 ataga
# 4 4 1 --attga 3, 4, 5, 6, 7 attga
# 5 1 2 a---ggg 1, 5, 6, 7 aggg
# 6 2 2 acgttgg 1, 5, 6, 7 atgg
# 7 3 2 a---tgg 1, 5, 6, 7 atgg
# 8 4 2 a---tgg 1, 5, 6, 7 atgg
# 9 5 2 aggatgg 1, 5, 6, 7 atgg
库(dplyr)
test_df%filter(隔离%c(1,3,4)中的%s))%%>%group_by(label)%%>%summary(pos_to_keep=list(唯一)(排序(未列出(positions)'))
#制作一个函数来提取相关的字母
getletters%变异(新对齐=getletters(对齐,位置保持))
#隔离标签对齐位置以保持新对齐
#1--atc-a 3,4,5,6,7 atc-a
#2-2-1 at----a 3,4,5,6,7----a
#3-3-1-ataga 3,4,5,6,7 ataga
#4-4-1-attga 3,4,5,6,7 attga
#512A---GGG1,5,6,7 aggg
#6 2 acgttgg 1,5,6,7 atgg
#7 3 2 a---tgg 1、5、6、7 atgg
#8 4 2 a---tgg 1、5、6、7 atgg
#9.5.2总计1、5、6、7总计
imo有点不清楚您是如何获得预期结果的。你能用文字解释一下--atc-a
如何转到atc-a
,以及at---a
如何转到--a
等吗please@elsherbini太棒了!很高兴我能帮忙。