Создать вектор целочисленных интервалов для удаления нескольких строк из фрейма данных в R - PullRequest
1 голос
/ 04 февраля 2020

Я провел биоинформационный анализ 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 Я не знаю, как его реализовать.

Если у вас есть идеи о том, как мне удастся решить мою проблему без ручной обработки моих данных, я был бы очень благодарен .

Надеюсь, все достаточно ясно

Жду вашего ответа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...