我有data.table
,我需要在其上计算一些新值,并选择min
值的行。
tb <- data.table(g_id=c(1, 1, 1, 2, 2, 2, 3),
item_no=c(24,25,26,27,28,29,30),
time_no=c(100, 110, 120, 130, 140, 160, 160),
key="g_id")
# g_id item_no time_no
# 1: 1 24 100
# 2: 1 25 110
# 3: 1 26 120
# 4: 2 27 130
# 5: 2 28 140
# 6: 2 29 160
# 7: 3 30 160
ts <- 118
gId <- 2
tb[.(gId), list(item_no, tdiff={z=abs(time_no - ts)})]
# g_id item_no tdiff
# 1: 2 27 12
# 2: 2 28 22
# 3: 2 29 42
现在我需要以最小item_no
tdiff
这一行)
# g_id item_no tdiff
# 1: 2 27 12
我可以使用tb
进行一次操作吗?最快的方法是什么(因为我需要执行大约500,000行的操作)?
答案 0 :(得分:3)
您可以尝试.SD
和[][]
链查询。
我理解的问题是,首先更新新列,然后找到最小的tdiff
library(data.table)
tb <- data.table(g_id=c(1, 1, 1, 2, 2, 2, 3),
item_no=c(24,25,26,27,28,29,30),
time_no=c(100, 110, 120, 130, 140, 160, 160),
key="g_id")
ts <- 118
# My solution is quite simple
tb[, tdiff := list(tdiff=abs(time_no - ts))][, .SD[which.min(tdiff)], by = key(tb)]
我认为.SD
更合适。您也可以使用:=
这是输出:
g_id item_no time_no tdiff 1: 1 26 120 2 2: 2 27 130 12 3: 3 30 160 42
答案 1 :(得分:1)
data.table调用可以链接在一起[][][]
所以你只需要一个额外的命令来获取每个g_id
的最小值:
tb[.(gId), list(item_no, tdiff={z=abs(time_no - ts)})][,item_no[which.min(tdiff)],by=g_id]