根据数据框r中的特定条件提取行

时间:2019-07-16 00:00:33

标签: r

我有一个包含77,760行的数据框,并且我只想提取行号差为13的行。所以我想要像1st,14th,27th,40th,53th,66th,79th,92th,105th,118th这样的行,第131、144。但是在144的每个倍数之后,我要取下一行(第145、289 ..),并再次提取相同的13列差值序列。因此,在第144行之后,我不希望下一个第157行,而是第145个行,然后它继续执行第1个... 144个,第145个,第158个...直到到达144的下一个倍数(即第288行),然后再达到1个... 144 ,145th,158th,171th ... 288th,289th ... 302th ... ... 77,760 row。

到目前为止,作为我上一篇文章的解决方案,我尝试使用以下命令提取所有相差第13位的行。

my_frame[seq(from = 1, to = nrow(dataframe), by = 13), ]

但是,现在我想从理论上说在每第144、288、432行之后重置行seq并提取行,如前所述

我得到的实际结果是:第1、14、144、157、170 ... 77,760行

预期结果:第1名,第14名... 144名,145名,158名... 288名,289名... ... 432名,433名...... 77,760名

有人能在逻辑上帮助我吗?

2 个答案:

答案 0 :(得分:2)

您可以先生成行号,然后使用它来子集数据框-

row_numbers <- c(sapply(seq(1, 77760, 144), function(x) seq(x, by = 13, length.out = 12)))

head(row_numbers, 50)
 [1]   1  14  27  40  53  66  79  92 105 118 131 144 145 158 171 184 197 210 223 236 
[21] 249 262 275 288 289 302 315 328 341 354 367 380 393 406 419 432 433 446 459 472
[41] 485 498 511 524 537 550 563 576 577 590

result <- your_df[row_numbers, ]

答案 1 :(得分:0)

另一种选择是使用while循环生成行号,然后继续从这些行中提取数据。在每次while循环时,“索引”变量用于从行号跳转到另一行。如果此“索引”的值是144的倍数,则“索引”将增加1,否则将增加13。“索引”存储的每个值都将成为“ imp_row”向量的一部分。

index = 1
final_row = nrow(data_frame_name) 
#Obtain the no. of rows; this will be used to limit the number generation process of while loop
imp_row = c() #this will hold all the important row numbers
while(index<final_row){ #perform number generation until we reach the final row number
  imp_row = append(imp_row, index) 
  if((index%%144) == 0){ 
    index = index + 1}else{
    index = index + 13
  }
}

head(imp_row,20)
#now you can index your dataframe via the imp_row vector as : data_frame_name[imp_row,]

或者,您也可以跳过在“ imp_row”中记录“ index”值,而直接将“ index”值用作数据框中的行号。

index = 1
final_row = nrow(data_frame_name) 
#Obtain the no. of rows; this will be used to limit the number generation process of while loop
while(index<final_row){ #perform number generation until we reach the final row number

  #you can directly use data_frame_name[index, ] and perform your operation of 
  #interest at those specific row numbers, and then  
  #increment 'index' as per your requirements

  if((index%%144) == 0){ 
    index = index + 1}else{
    index = index + 13
  }

}