У меня есть фрейм данных под названием lbt_all_epitopes
из 38282 строк и трех столбцов, как показано ниже:R - не в состоянии хранить несколько выход из за цикл в векторе или данных кадре
sequence score epitope.
1 RPGGPPGYRTPYTAK 1.724911 Epitope
2 TQGDRQKIQDAVSAA 1.664611 Epitope
3 EVKSRYNVDVSQNKR 1.593236 Epitope
4 VIEMTRAFEDDDFDK 1.578200 Epitope
5 ITQGDRQKIQDAVSA 1.533208 Epitope
6 GSADLTPSNLTRPAS 1.532700 Epitope
В первом столбце (с именем последовательность) У меня есть несколько похожих строк, которые я хочу удалить (я буду искать похожие строки, используя str_sub
). Например, учитывая первую строку lbt_all_epitopes$sequence
(«RPGGPPGYRTPYTAK»), я хочу искать похожие строки во всем столбце и хранить их в vector
или в data.frame
, который будет называться to_be_removed
. Я хочу сделать эту итерацию для первых 30 элементов, присутствующих в lbt_all_epitopes$sequence
. Для простоты давайте рассмотрим пять верхних рядов. Когда я запускаю цикл, как показано ниже:
# Iterate over the first 5 rows
top_30 <- 1:5
for(i in top_30) {
print(agrep(str_sub(lbt_all_epitopes$sequence[i], start = 5, end = 11), lbt_all_epitopes$sequence, value = T))
}
Выход:
[1] "RPGGPPGYRTPYTAK" "VGTRPGGPPGYRTPY" "TRPGGPPGYRTPYTA" "GGPPGYRTPYTAKPF" "PGGPPGYRTPYTAKP"
[6] "LVGTRPGGPPGYRTP" "TLVGTRPGGPPGYRT" "GPPGYRTPYTAKPFV" "PPGYRTPYTAKPFVM" "GTRPGGPPGYRTPYT"
[11] "PGYRTPYTAKPFVMC"
[1] "TQGDRQKIQDAVSAA" "ITQGDRQKIQDAVSA" "GITQGDRQKIQDAVS" "NGITQGDRQKIQDAV" "QGDRQKIQDAVSAAS"
[6] "QNGITQGDRQKIQDA" "GDRQKIQDAVSAASS" "VQNGITQGDRQKIQD" "DRQKIQDAVSAASSW" "RQKIQDAVSAASSWL"
[11] "QKIQDAVSAASSWLE"
[1] "EVKSRYNVDVSQNKR" "VKSRYNVDVSQNKRA" "NEVKSRYNVDVSQNK" "KSRYNVDVSQNKRAR" "LNEVKSRYNVDVSQN"
[6] "YNVDVSQNKRARLRL" "RYNVDVSQNKRARLR" "MLNEVKSRYNVDVSQ" "SRYNVDVSQNKRARL" "HMLNEVKSRYNVDVS"
[11] "EHMLNEVKSRYNVDV"
[1] "VIEMTRAFEDDDFDK" "RVIEMTRAFEDDDFD" "GDRVIEMTRAFEDDD" "DRVIEMTRAFEDDDF" "IEMTRAFEDDDFDKF"
[6] "RGDRVIEMTRAFEDD" "EMTRAFEDDDFDKFD" "FRGDRVIEMTRAFED" "MTRAFEDDDFDKFDR" "TRAFEDDDFDKFDRV"
[11] "RAFEDDDFDKFDRVR"
[1] "TQGDRQKIQDAVSAA" "ITQGDRQKIQDAVSA" "GITQGDRQKIQDAVS" "NGITQGDRQKIQDAV" "QGDRQKIQDAVSAAS"
[6] "QNGITQGDRQKIQDA" "GDRQKIQDAVSAASS" "VQNGITQGDRQKIQD" "DVQNGITQGDRQKIQ" "DRQKIQDAVSAASSW"
[11] "RQKIQDAVSAASSWL"
именно то, что я хочу, т.е. распечатаны все подобные строки (11 на одну итерацию) к первой, второй , третий ... пятый элемент lbt_all_epitopes$sequence
. Однако, когда я пытаюсь сохранить вывод в векторе (так называемый to_be_removed
), со следующей петлей:
# create the empty vector where I will store the output
to_be_removed <- c()
for(i in top_30) {
to_be_removed[i] <- agrep(str_sub(lbt_all_epitopes$sequence[i], start = 5, end = 11), lbt_all_epitopes$sequence, value = T)
}
Я заметил, что каждая итерация производится только одну строку в качестве выхода (в отличие от 11 строк для каждого итерации), как показано ниже:
> to_be_removed
[1] "RPGGPPGYRTPYTAK" "TQGDRQKIQDAVSAA" "EVKSRYNVDVSQNKR" "VIEMTRAFEDDDFDK" "TQGDRQKIQDAVSAA"
было показано следующее предупреждение:
Warning messages:
1: In to_be_removed[i] <- agrep(str_sub(lbt_all_epitopes$sequence[i], :
number of items to replace is not a multiple of replacement length
2: In to_be_removed[i] <- agrep(str_sub(lbt_all_epitopes$sequence[i], :
number of items to replace is not a multiple of replacement length
3: In to_be_removed[i] <- agrep(str_sub(lbt_all_epitopes$sequence[i], :
number of items to replace is not a multiple of replacement length
4: In to_be_removed[i] <- agrep(str_sub(lbt_all_epitopes$sequence[i], :
number of items to replace is not a multiple of replacement length
5: In to_be_removed[i] <- agrep(str_sub(lbt_all_epitopes$sequence[i], :
number of items to replace is not a multiple of replacement length
я тогда предположить, что я СУИ пойте код, говорящий R, что он также должен конкатенировать все строки, созданные каждой итерацией, а затем перейти к следующей итерации. Кто-нибудь знает, как правильно сохранить вывод в vector
, или даже в data.frame
?
Я уверен, что вы не можете хранить объект длиной> 1 в одной записи вектора. Почему бы не использовать список? Попробуйте что-то вроде 'to_be_removed <- lapply (lbt_all_epitopes $ sequence [1: 5], function (x) agrep (str_sub (x, start = 5, end = 11), lbt_all_epitopes $ sequence, value = T))' – LAP
вы могли бы предоставить свой набор данных в виде 'dput (head (lbt_all_epitopes))'? – LAP
Спасибо, он выполняет эту работу, как и адаптированный цикл от коллеги ниже. Вы знаете какой-либо другой способ хранения вывода в data.frame? В этом случае было бы лучше иметь фрейм данных, чтобы я мог искать строки в to_be_removed в моем исходном наборе данных (lbt_all_epitopes), чтобы удалить их. Благодарю. Да в следующий раз я буду писать с dput – BCArg