как мы можем объединить строки на основе ключевых данных - PullRequest
0 голосов
/ 30 октября 2019

У меня есть такие данные

В основном я пытаюсь объединить все части раздела, и у меня есть такой вывод

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 <</strong> Первый столбец показывает положение каждой буквы. Первый столбец - это позиция каждой буквы

. Итак, давайте возьмем данные первого раздела

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 соответствует M в первом 2 соответствует 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))

1 Ответ

1 голос
/ 30 октября 2019

Из того, что я понимаю, вам нужно взять последнюю букву всех записей и вставить ее во 2-ю запись, учитывая, что вы разбили свои группы (каждая группа определена 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...