如何对已过滤的数据表中的每一行过滤和执行组操作

时间:2017-09-17 10:49:13

标签: r group-by data.table where

我想过滤数据表并对过滤后的数据表的每一行执行一些计算。我知道我可以通过两个步骤完成此操作:1)过滤数据表并分配给新对象,2)计算我已经过滤的表上需要的内容。

但有没有办法一步到位?即一种在by=参数中使用过滤表的行数的方法? 我的样本数据:

test <- data.frame(min_date = c("2017-08-03", "2017-09-10", "2017-10-03"),
               max_date = c("2017-08-10", "2017-10-12", "2017-11-01"),
               group = c("g1", "g2", "g1"), loc = c("1", "2", "1"))

我想只过滤组g1,并为每条记录添加min_date和max_date之间每天的新行。

没有过滤,我会这样做:

dt <- setDT(test)[ , list(group = group, loc = loc,
                                  min_date = min(as.Date(min_date)),
                                  max_date = max(as.Date(max_date)),
                                  loc = loc,
                                  date = seq(as.Date(min_date),
                                             as.Date(max_date),
                                             by = "day")),
              by = 1:nrow(test)]

使用过滤,如果我知道过滤后的行数:

dt <- setDT(test)[group == "g1", list(group = group, loc = loc,
                                  min_date = min(as.Date(min_date)),
                                  max_date = max(as.Date(max_date)),
                                  loc = loc,
                                  date = seq(as.Date(min_date),
                                             as.Date(max_date),
                                             by = "day")),
              by = 1:2]

问题是,我无法使用硬编码的行数和nrow(test)以及.N返回原始数据集的行数。

进行过滤然后按操作分组的最快方法是什么?是过滤,分配给新对象并通过唯一(和最好)的方式执行分组吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

将评论中的三个建议移到答案中,您可以尝试下列其中一项(按nchar排序,而不是按性能排序,因为我不知道您必须重新创建可比较大的条件样本数据以测试性能):

test[group == "g1", thing_you_want_to_do, test[group == "g1", .I]]
test[group == "g1", thing_you_want_to_do, seq_len(test[group == "g1", .N])]
test[, nrows := .N, group][group == "g1", thing_you_want_to_do, by = seq_len(nrows[1])]

显然,请用实际计算替换thing_you_want_to_do