Я провел биоинформационный анализ c, в результате которого был получен действительно плохо отформатированный лист результатов, содержащий до 60 000 строк. Мне нужно удалить много результатов, которые меня не интересуют.
Вот пример: первые 20 строк фрейма данных после импорта текстового файла в R (фрейм данных имеет только один столбец):
Df <- structure(list(V1 = c(" QUERY: AT1G10657|AT1G10657.3;AT1G10657.2;AT1G10657.1;AT1G10657.4",
" TFBS AC: RSP00038//OS: tomato (Lycopersicon esculentum), Lycopersicon esculentum /GENE: LAT52; LAT56;/TFBS: 52/56 box /BF: GT-1 related transcription factors",
" 792 TGTGGTTATATt 781 (Mism.= 1)", " TFBS AC: RSP00621//OS: tomato (Lycopersicon esculentum), Lycopersicon esculentum /GENE: rbcS2/TFBS: C-rich Q /BF: unknown nuclear factor",
" 716 CCtCTCCTC 724 (Mism.= 1)", " TFBS AC: RSP00654//OS: spinach (Spinacia oleracea) /GENE: PetH/TFBS: CT-B /BF: unknown nuclear factor",
" 322 CACCCAaTTC 331 (Mism.= 1)", " TFBS AC: RSP00863//OS: arabidopsis (Arabidopsis thaliana) /GENE: STK/TFBS: GA-4 /BF: BPC1",
" 991 AGAGAGGAA 999 (Mism.= 0)", " TFBS AC: RSP01275//OS: parsley (Petroselinum crispum) /GENE: PcACO-IV/TFBS: ACE 2 /BF: 2 unknown noncooperative nuclear factors",
" 212 TtCACGTCAT 221 (Mism.= 1)", " TFBS AC: RSP01304//OS: tomato (Lycopersicon esculentum) /GENE: A1 EF-1alpha/TFBS: Telo box /BF: unknown nuclear factor",
" 553 aGAACCCTAA 562 (Mism.= 1)", " TFBS AC: RSP01661//OS: Arabidopsis (Arabidopsis thaliana) /GENE: CKX5/6 (At1g75450)/TFBS: C/G-box /BF: HY5",
" 222 TATGACGTGAaa 211 (Mism.= 2)", " TFBS AC: RSP02010//OS: Arabidopsis (Arabidopsis thaliana) /GENE: MYB2/TFBS: W-box 6 /BF: WRKY40",
" 78 aCCAGTCACTtT 89 (Mism.= 2)", " TFBS AC: RSP02326//OS: Arabidopsis (Arabidopsis thaliana) /GENE: BiP2/TFBS: TL1 /BF: TBF1",
" 452 GAAGAAGAA 460 (Mism.= 0)", " 950 GAAGAAGAA 958 (Mism.= 0)"
)), row.names = c(NA, -20L), class = "data.frame")
Я хочу оставить только строки "QUERY" и "TFBS" из растения "Arabidopsis" и последовательность (и) под каждой строкой, упоминающей "Arabidopsis", и удалить все данные из другие растения (здесь «помидор», «петрушка» или «шпинат»).
Итак, сейчас я использовал регулярное выражение для индексации строк, содержащих информацию, которую я хочу или нет.
Index_Query <- which(grepl("QUERY", Df$V1))
Index_Df_arabi <- which(grepl("arabidopsis|Arabidopsis", Df$V1))
Index_Df_other <- which(grepl("tomato|spinach|parsley", Df$V1))
> Index_Query
[1] 1
> Index_Df_arabi
[1] 8 14 16 18
> Index_Df_other
[1] 2 4 6 10 12
И поэтому я хотел бы сохранить ряд (ы) "QUERY" и удалить все строки в интервале между строками от Index_Df_other (включая его) до следующего от Index_Df_arabi (исключая его) и сохраняя строки от Index_Df_arabi (включая его) до следующего от Index_Df_other (исключая его).
Так что в этом случае получить такой фрейм данных
> Df[c(1,8:9,14:20),]
[1] QUERY: AT1G10657|AT1G10657.3;AT1G10657.2;AT1G10657.1;AT1G10657.4
[2] TFBS AC: RSP00863//OS: arabidopsis (Arabidopsis thaliana) /GENE: STK/TFBS: GA-4 /BF: BPC1
[3] 991 AGAGAGGAA 999 (Mism.= 0)
[4] TFBS AC: RSP01661//OS: Arabidopsis (Arabidopsis thaliana) /GENE: CKX5/6 (At1g75450)/TFBS: C/G-box /BF: HY5
[5] 222 TATGACGTGAaa 211 (Mism.= 2)
[6] TFBS AC: RSP02010//OS: Arabidopsis (Arabidopsis thaliana) /GENE: MYB2/TFBS: W-box 6 /BF: WRKY40
[7] 78 aCCAGTCACTtT 89 (Mism.= 2)
[8] TFBS AC: RSP02326//OS: Arabidopsis (Arabidopsis thaliana) /GENE: BiP2/TFBS: TL1 /BF: TBF1
[9] 452 GAAGAAGAA 460 (Mism.= 0)
[10] 950 GAAGAAGAA 958 (Mism.= 0)
Я пытался напрямую использовать индекс через мой фрейм данных, выполняя некоторые циклы, но я не очень знаком с этим, и это было неудачно
У меня есть идея создать вектор интервалов или, если невозможно, создать вектор, содержащий все номера строк, которые я хочу удалить / сохранить
Я пытался это также безуспешно
for(a in 1:length(Index_Df_arabi))for(b in 1:length(Index_Df_other)){
if(Index_Df_other[b] < Index_Df_arabi[a] ){IndexAll <- Index_Df_other[b]:Index_Df_arabi[a]}
else{IndexAll <- Index_Df_arabi[a]:Index_Df_other[b]}
}
> IndexAll
[1] 12 13 14 15 16 17 18
Я полагаю, что мой l oop не работает, потому что вектор IndexAll Я не знаю, как его реализовать.
Если у вас есть идеи о том, как мне удастся решить мою проблему без ручной обработки моих данных, я был бы очень благодарен .
Надеюсь, все достаточно ясно
Жду вашего ответа