我有一个包含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名
有人能在逻辑上帮助我吗?
答案 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
}
}