从数据框的一列子集模式系列

Subset a patterned series from one column of a dataframe

给定以下数据框:

set.seed(1)
df <- data.frame(rnorm(600))

我想从中划分出每隔五个一组的子集。本质上,将数据集切成两半,使 n = 300。一种方法如下:

subset.df <- data.frame(df$rnorm.600.[c(1:5, 11:15, 21:25, 31:35, 41:45, 51:55, 61:65, 71:75, 81:85, 91:95, 101:105, 111:115, 121:125, 131:135, 141:145, 151:155, 161:165, 171:175, 181:185, 191:195, 201:205, 211:215, 221:225, 231:235, 241:245, 251:255, 261:265, 271:275, 281:285, 291:295, 301:305, 311:315, 321:325, 331:335, 341:345, 351:355, 361:365, 371:375, 381:385, 391:395, 401:405, 411:415, 421:425, 431:435, 441:445, 451:455, 461:465, 471:475, 481:485, 491:495, 501:505, 511:515, 521:525, 531:535, 541:545, 551:555, 561:565, 571:575, 581:585, 591:595)])

但是,这段代码非常繁琐。有没有可以更有效地做到这一点的功能?感谢您的帮助!

您可以在索引中使用一些模块化数学:

df[((seq(nrow(df)) - 1) %% 10) < 5,]
df[c(rep(TRUE, 5), rep(FALSE,5)),]

这是通过创建 5 个 TRUE 和 5 个 FALSE 的交替模式来实现的,R 将其循环到数据的长度。然后我们使用这些值来包含或排除这些行,因为 df[ROWS_I_WANT,] 将包含所有 ROWS_I_WANT 和所有列。

您可以将数据框拆分成一个列表:

df_list <- slit(df, gl(2, 5, nrow(df))

您然后 select 您想要的子集:

df_list[[1]]

我们可以这样在基础 R subset 中使用:

subset(df$rnorm.600., rep(0:1, times=nrow(df)/10, each=5) == 0)