R-每个组获得前N-1行
这是一个用例,其中我们有id的时间戳数据(例如,每个受试者在一段时间内的多个观察值),我们希望使用所有以前的测量值来预测数据集中的最后一个测量值 这与以下问题有关: 目前,我正在使用data.table包,该包使用链接问题中的解决方案为每组选择第一行或最后一行时非常有效 当我尝试选择前N_g-1行(其中N_g是当前组中的行数)时,查询需要很长时间。有人知道这样做的有效方法吗。以下是我目前正在使用的内容:R-每个组获得前N-1行,r,dataframe,data.table,R,Dataframe,Data.table,这是一个用例,其中我们有id的时间戳数据(例如,每个受试者在一段时间内的多个观察值),我们希望使用所有以前的测量值来预测数据集中的最后一个测量值 这与以下问题有关: 目前,我正在使用data.table包,该包使用链接问题中的解决方案为每组选择第一行或最后一行时非常有效 当我尝试选择前N_g-1行(其中N_g是当前组中的行数)时,查询需要很长时间。有人知道这样做的有效方法吗。以下是我目前正在使用的内容: firstn_elements <- dt[, .SD[1:(.N-1)], by=s
firstn_elements <- dt[, .SD[1:(.N-1)], by=subject_id]
firstn\u elements使用.I
提取行索引,我们可以更快地完成这项工作
dt[dt[, .I[1:(.N-1)], by = subject_id]$V1]
基准
尝试使用.I
,即dt[dt[,.I[1:(.N-1)],by=subject\u-id]$V1]
(基准为.SD
与.I
提取)。非常相关的问答,可以说是重复:谢谢@akrun,$V1在这种情况下做什么?@Bar the dt[,.I[1:(.N-1)],by=subject\u-id]`创建一个“V1”列,因为我们没有命名.I[1:(.N-1)]
。用$V1
FWIW提取该列,这要快一点:dt[dt[,-.I[.N],by=subject\u id]$V1]
谢谢!你知道为什么我写的代码中使用.SD
这么慢吗?可能最好使用头(.I,.N-1L)
或Josh的想法,因为.N==1L
案例会产生一些奇怪的东西,这个答案的标题是这个版本。
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
system.time(dt[dt[, -.I[.N], by = subject_id]$V1])
# user system elapsed
# 0.69 0.04 0.55