2017-02-10 3 views
1

У меня есть кадр bp_example данных, который выглядит следующим образом:Получить символы из одного столбца на основе входных данных из столбца в стороне

structure(list(Sequence = c("Sequence", "Sequence", "Sequence", 
"Sequence", "Sequence", "Sequence", "Sequence", "Sequence", "Sequence", 
"Sequence", "Sequence", "Sequence", "Sequence", "Sequence", "Sequence", 
"Sequence", "Sequence", "Sequence", "Sequence", "Sequence", "Sequence", 
"Sequence", "Sequence", "Sequence", "Sequence"), start = c(1, 
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
20, 21, 22, 23, 24, 25), end = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25), 
    score = c(-0.205, -0.229, -0.115, -0.427, -0.327, -0.543, 
    -0.717, -0.923, -1.241, -1.471, -1.737, -1.717, -1.247, -1.137, 
    -0.689, -0.731, -0.337, 0.091, 0.579, 0.93, 0.575, 0.128, 
    -0.036, -0.186, -0.259), residue = c("M", "D", "A", "R", 
    "M", "R", "E", "L", "S", "F", "K", "V", "V", "L", "L", "G", 
    "E", "G", "R", "V", "G", "K", "T", "S", "L"), epitope = c(".", 
    ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", ".", 
    ".", ".", ".", ".", ".", "E", "E", "E", ".", ".", ".", "." 
    )), .Names = c("Sequence", "start", "end", "score", "residue", 
"epitope"), class = c("data.table", "data.frame"), row.names = c(NA, 
-25L)) 

Я не совсем уверен, что это можно делать то, что я хочу, но в любом случае , вот. Я хочу выполнить итерацию по столбцу bp_example$epitope, и в случае, если в колонке больше, скажем, 14 «Es», т.е. 15 или более последовательных строк, где в столбце появляется «E», я хотел бы иметь соответствующий символы в предыдущем столбце (bp_example$residue), напечатанные как одна строка (множитель).

Учитывая пример, который я дал, хотел бы, чтобы строка MDARMRELSFKVVLLG напечатана (лучше всего хранится как элемент list или data.frame).

У меня был ход с while петлями, но никакого успеха на всех.

+1

Или что вы хотите? – akrun

+1

Возможно, это помогает библиотеке (data.table); setDT (df1) [, grp: = rleid (epitope == "E")] [epitope == "E", list (остатокConcat = if (.N> 14) list (остаток)), (последовательность, grp) ] ' – akrun

+0

Знаете ли вы способ получить результат как один вектор символа? Я хочу сказать, что я хотел бы получить 'MDARMRELSFKVVLLG' вместо' [1] "M" "D" "A" "R" "M" "R" "E" "L" "S" "F" "K" «V» «V» «L» «L» «G» (я не сформулировал вопрос точно так, как я считаю) – BCArg

ответ

1

Здесь можно использовать data.table. Преобразуйте «data.frame» в «data.table» (setDT(df1)), создав столбец run-lengh-id (rleid) («grp», основанный на значении «E» в «epitome». Сгруппирован по «последовательности» 'и „GRP“, мы указываем логическое условие в i (epitome == "E") и if количество строк (.N) больше, чем 14, то paste в „остатков“ элементы вместе

library(data.table) 
setDT(df1)[, grp := rleid(epitope=="E")][epitope == "E", 
    .(residueConcat = if(.N > 14) paste(trimws(residue), collapse="")), .(Sequence, grp)] 
+0

Он работал с форматом, который я изначально использовал. Не могли бы вы взглянуть на новый формат data.frame, который я использую? Я только что редактировал свой вопрос, и если я запустил этот код в новом фрейме данных, я получаю следующую ошибку: 'Ошибка в': = '(grp, rleid (epitope ==" E ")): Проверьте, что is.data .table (DT) == TRUE. В противном случае: = и ': =' (...) определены для использования в j, как только и в частности способами. См. Справку (": ="). ' – BCArg

+1

@BCArg Я забыл', 'перед тем, как 'grp: =' исправил его.BTW, в новом примере максимальное число строк равно 3, и у вас нет группы, которая больше 14 – akrun

+1

@BCArg. В новом примере 'setDT (bp_example) [, grp: = rleid (epitope == «E»)] [эпитоп == «E»,. (ОстатокConcat = if (.N> 2) паста (тримны (вычет), collapse = "")), (последовательность, grp)] Последовательность grp остатокConcat # 1: Sequence 2 RVG' – akrun

1

параметр, используя базовый R Я не думаю, что вы должны использовать цикл для этого. В приведенном ниже коде я предлагаю найти соответствующие индексы и в результирующем векторе, найти последовательности с более чем 14 элементами:

#find matchin indexes 
matching <- which(bp_example$epitope == 'E') 

#separate vectors with elements in sequence 
index <- split(matching, cumsum(seq_along(matching) %in% (which(diff(matching)>1)+1))) 

#get the result by subscripting with indexes from vectors 
result <- lapply(index, function(x) if(length(x)> 14) paste0(bp_example$residue[x], collapse = '')) 

Чтобы получить окончательный результат в виде кадра данных, с каждой совпадающей последовательности в новой строке:

as.data.frame(unlist(result)) 
+0

отлично. Вы знаете, как сохранить вывод в 'data.frame', а не в' list' – BCArg

+0

Как вы ожидаете его в 'data.frame'? Каждая комбинация в новой строке или новый столбец? Потому что в вашем предыдущем примере у вас была только одна последовательность, которая соответствовала более 14 «Es», но вы могли бы иметь гораздо больше. –

+0

exaclty, я хотел бы иметь каждый набор строк> 14 в новой строке – BCArg

Смежные вопросы