我们如何根据一个关键数据合并字符串



我有一个类似的数据

基本上,我正在尝试合并所有部分,并有一个像这样的输出

df<- structure(list(position = structure(c(6L, 1L, 2L, 3L, 4L, 5L, 
1L, 2L, 7L, 1L, 2L, 3L, 4L, 8L, 1L, 2L, 3L, 4L), .Label = c("1,2,3,4,5,6,7,8,9,10,11,12,13,14,15", 
"2,3,4,5,6,7,8,9,10,11,12,13,14,15,16", "3,4,5,6,7,8,9,10,11,12,13,14,15,16,17", 
"4,5,6,7,8,9,10,11,12,13,14,15,16,17,18", "TP<AMB88", "TP<AMT55", 
"TP<ELANE", "TP<RACK1"), class = "factor"), col = structure(c(15L, 
6L, 3L, 11L, 5L, 14L, 9L, 18L, 16L, 8L, 13L, 4L, 2L, 17L, 7L, 
12L, 1L, 10L), .Label = c("EQMTLRGTLKGHNGW", "GRRLACLFLACVLPA", 
"GSLSNYALLQLTLTA", "LGRRLACLFLACVLP", "LSNYALLQLTLTAFL", "MGSLSNYALLQLTLT", 
"MTEQMTLRGTLKGHN", "MTLGRRLACLFLACV", "MVKETTYYDVLGVKP", "QMTLRGTLKGHNGWV", 
"SLSNYALLQLTLTAF", "TEQMTLRGTLKGHNG", "TLGRRLACLFLACVL", "TP<AMB88", 
"TP<AMT55", "TP<ELANE", "TP<RACK1", "VKETTYYDVLGVKPN"), class = "factor")), class = "data.frame", row.names = c(NA, 
-18L))

每个部分标题以TP<第一列显示每个字母的位置。第一列是每个字母的位置

所以让我们取第一段数据

TP<AMT55                                       TP<AMT55
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15          MGSLSNYALLQLTLT
2,3,4,5,6,7,8,9,10,11,12,13,14,15,16         GSLSNYALLQLTLTA
3,4,5,6,7,8,9,10,11,12,13,14,15,16,17        SLSNYALLQLTLTAF
4,5,6,7,8,9,10,11,12,13,14,15,16,17,18       LSNYALLQLTLTAFL

基本上,它就像下面这样,但把它分成了不同的组。所以我想合并以上所有内容,并获得以下

TP<AMT55                                            TP<AMT55
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18          MGSLSNYALLQLTLTAFL

现在我正试着把所有的信都放回去,然后拿到上面的

例如,如果我们看看这个

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
MGSLSNYALLQLTLT
3
2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
GSLSNYALLQLTLTA

1对应于第一个中的M2对应于G(第一和第二(3对应于S(在第一和第二个中(等

out<- structure(list(position = structure(c(6L, 1L, 2L, 3L, 4L, 5L, 
1L, 2L, 7L, 1L, 2L, 3L, 4L, 8L, 1L, 2L, 3L, 4L), .Label = c("1,2,3,4,5,6,7,8,9,10,11,12,13,14,15", 
"2,3,4,5,6,7,8,9,10,11,12,13,14,15,16", "3,4,5,6,7,8,9,10,11,12,13,14,15,16,17", 
"4,5,6,7,8,9,10,11,12,13,14,15,16,17,18", "TP<AMB88", "TP<AMT55", 
"TP<ELANE", "TP<RACK1"), class = "factor"), col = structure(c(15L, 
6L, 3L, 11L, 5L, 14L, 9L, 18L, 16L, 8L, 13L, 4L, 2L, 17L, 7L, 
12L, 1L, 10L), .Label = c("EQMTLRGTLKGHNGW", "GRRLACLFLACVLPA", 
"GSLSNYALLQLTLTA", "LGRRLACLFLACVLP", "LSNYALLQLTLTAFL", "MGSLSNYALLQLTLT", 
"MTEQMTLRGTLKGHN", "MTLGRRLACLFLACV", "MVKETTYYDVLGVKP", "QMTLRGTLKGHNGWV", 
"SLSNYALLQLTLTAF", "TEQMTLRGTLKGHNG", "TLGRRLACLFLACVL", "TP<AMB88", 
"TP<AMT55", "TP<ELANE", "TP<RACK1", "VKETTYYDVLGVKPN"), class = "factor"), 
join = structure(c(7L, 2L, 1L, 1L, 1L, 6L, 5L, 1L, 8L, 4L, 
1L, 1L, 1L, 9L, 3L, 1L, 1L, 1L), .Label = c("", "MGSLSNYALLQLTLTAFL", 
"MTEQMTLRGTLKGHNGWV", "MTLGRRLACLFLACVLPA", "MVKETTYYDVLGVKPN", 
"TP<AMB88", "TP<AMT55", "TP<ELANE", "TP<RACK1"), class = "factor")), class = "data.frame", row.names = c(NA, 
-18L))

根据我的理解,您需要取所有条目的最后一个字母,并将其粘贴在第二个条目上,考虑到您的分组(每个分组由TP定义(。

#make sure columns are character, not factors
df[] <- lapply(df, as.character)
l1 <- split(df, cumsum(grepl('TP', df$position)))
lapply(l1, function(i) paste0(i$col[2], paste(sapply(i$col[3:nrow(i)], 
function(j) substr(j, nchar(j), nchar(j))), collapse = '')))
#$`1`
#[1] "MGSLSNYALLQLTLTAFL"
#$`2`
#[1] "MVKETTYYDVLGVKPN"
#$`3`
#[1] "MTLGRRLACLFLACVLPA"
#$`4`
#[1] "MTEQMTLRGTLKGHNGWV"

即使它变得有点拥挤,我们也可以把它送到你想要的结构,

do.call(rbind, lapply(l1, function(i) {dd <- cbind.data.frame(i, join = paste0(i$col[2], paste(sapply(i$col[3:nrow(i)], function(j) substr(j, nchar(j), nchar(j))), collapse = ''))); dd$join <- as.character(dd$join); dd$join[1] <- dd$col[1]; dd$join[3:nrow(dd)] <- ''; dd}))


position             col               join
1.1                                TP<AMT55        TP<AMT55           TP<AMT55
1.2     1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 MGSLSNYALLQLTLT MGSLSNYALLQLTLTAFL
1.3    2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 GSLSNYALLQLTLTA                   
1.4   3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 SLSNYALLQLTLTAF                   
1.5  4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 LSNYALLQLTLTAFL                   
2.6                                TP<AMB88        TP<AMB88           TP<AMB88
2.7     1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 MVKETTYYDVLGVKP   MVKETTYYDVLGVKPN
2.8    2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 VKETTYYDVLGVKPN                   
3.9                                TP<ELANE        TP<ELANE           TP<ELANE
3.10    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 MTLGRRLACLFLACV MTLGRRLACLFLACVLPA
3.11   2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 TLGRRLACLFLACVL                   
3.12  3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 LGRRLACLFLACVLP                   
3.13 4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 GRRLACLFLACVLPA                   
4.14                               TP<RACK1        TP<RACK1           TP<RACK1
4.15    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 MTEQMTLRGTLKGHN MTEQMTLRGTLKGHNGWV
4.16   2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 TEQMTLRGTLKGHNG                   
4.17  3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 EQMTLRGTLKGHNGW                   
4.18 4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 QMTLRGTLKGHNGWV

相关内容

最新更新