根据总行数的比例提取数据框的子集

时间:2014-05-23 10:10:38

标签: r dataframe subset

我想将数据帧子集化为多个相等的子集,这些子集基于数据帧中总行数的一部分。给定一个包含30行的数据帧(参见下面的简单示例数据),我想最终得到每3行长的10个数据子集。第一个子集将包含行1:3(行的前10%),第二个子集将包含行4:6(10% - 20%),依此类推,直到100%。

示例数据:

> dput(df)
structure(list(datetime = c("05/04/2012 14:56", "05/04/2012 14:57", 
"05/04/2012 14:58", "05/04/2012 14:59", "05/04/2012 15:00", "05/04/2012 15:01", 
"05/04/2012 15:02", "05/04/2012 15:03", "05/04/2012 15:04", "05/04/2012 15:05", 
"05/04/2012 15:06", "05/04/2012 15:07", "05/04/2012 15:08", "05/04/2012 15:09", 
"05/04/2012 15:10", "05/04/2012 15:11", "05/04/2012 15:12", "05/04/2012 15:13", 
"05/04/2012 15:14", "05/04/2012 15:15", "05/04/2012 15:16", "05/04/2012 15:17", 
"05/04/2012 15:18", "05/04/2012 15:19", "05/04/2012 15:20", "05/04/2012 15:21", 
"05/04/2012 15:22", "05/04/2012 15:23", "05/04/2012 15:24", "05/04/2012 15:25"
), count = c(23L, 56L, 45L, 33L, 34L, 33L, 19L, 28L, 24L, 17L, 
26L, 28L, 34L, 38L, 19L, 26L, 25L, 24L, 24L, 22L, 20L, 27L, 25L, 
18L, 37L, 32L, 28L, 26L, 25L, 23L), behav = c(1L, 1L, 2L, 2L, 
2L, 3L, 1L, 2L, 2L, 1L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 
1L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 3L), btime = c(473.1, 473.1, 
473.1, 473.1, 473.1, 473.1, 72.9, 72.9, 72.9, 72.9, 72.9, 72.9, 
72.9, 72.9, 72.9, 72.9, 543, 543, 543, 543, 543, 543, 543, 543, 
543, 543, 600, 600, 600, 600)), .Names = c("datetime", "count", 
"behav", "btime"), class = "data.frame", row.names = c(NA, -30L
))

我可以使用像obj1 = df[1:3, ]之类的东西手动执行此操作, obj2 = df[4:6, ]等......但我正在处理大型数据框,所以我想找到一种自动执行此操作的方法。我已设法使用下面的代码提取前10%的行(虽然我确信有更好的方法来做到这一点),但我正在努力继续提取后续子集。

obj1 = head(df[order(df$datetime),],0.1*nrow(df))

我想最终得到以下内容:

> obj1
          datetime     time count behav btime
1 05/04/2012 14:56 14:56:00    23     1 473.1
2 05/04/2012 14:57 14:57:00    56     1 473.1
3 05/04/2012 14:58 14:58:00    45     2 473.1

> obj2
          datetime     time count behav btime
4 05/04/2012 14:59 14:59:00    33     2 473.1
5 05/04/2012 15:00 15:00:00    34     2 473.1
6 05/04/2012 15:01 15:01:00    33     3 473.1

etc…to obj10

非常感谢任何建议。

1 个答案:

答案 0 :(得分:3)

使用cut创建分组变量grp,然后在其上分割df。这会给出一个列表obj,以便obj[[1]]是第一个组,等等。

grp <- cut(1:nrow(df), 10, labels = FALSE)
obj <- split(df, grp)

我建议不要创建10个单独的变量,但无论如何都要这样做:

names(obj) <- paste0("obj", names(obj))
attach(obj)

会将命名空间附加到包含它们的路径,或者以下内容将在工作区中创建此类变量:

names(obj) <- paste0("obj", names(obj))
for(g in names(obj)) assign(g, obj[[g]])

已修订改进名称。