R - 每组获得第一个N-1行

时间:2016-06-29 17:27:53

标签: r dataframe data.table

这是一个用例,我们用id标记了数据的时间戳(例如,每个主题随着时间的推移多次观察),我们希望使用所有先前的测量来预测数据集中的最后一个。

这与问题有关:How to select the first and last row within a grouping variable in a data frame?

目前,我正在使用data.table软件包,该软件包使用链接问题中的解决方案非常有效地选择每个组的第一行或最后一行。

当我尝试选择第一行N_g-1行(其中N_g是当前组中的行数)时,查询需要很长时间。有没有人知道做这样的事情的有效方法。这就是我目前正在使用的内容:

firstn_elements <- dt[, .SD[1:(.N-1)], by=subject_id]

1 个答案:

答案 0 :(得分:3)

我们可以使用.I更快地提取行索引。

dt[dt[, .I[1:(.N-1)], by = subject_id]$V1]

基准

set.seed(24)
dt <- data.table(subject_id = sample(1:100000, 1e7, replace=TRUE), value = rnorm(1e7))
system.time(dt[, .SD[1:(.N-1)], by=subject_id])
#  user  system elapsed 
# 45.89   17.92   65.00 
system.time(dt[dt[, .I[1:(.N-1)], by = subject_id]$V1])
#   user  system elapsed 
#   1.53    0.19    1.13 

包括@JoshO&#39; Brien的方法

system.time(dt[dt[, -.I[.N], by = subject_id]$V1])
#  user  system elapsed 
#  0.69    0.04    0.55