从 data.table 中选择具有最小值的行

Kat*_*ova 5 r data.table

我有一个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
Run Code Online (Sandbox Code Playgroud)

现在我需要以item_no最少的方式获取行(实际上只有这一行)tdiff

#    g_id item_no tdiff
# 1:    2      27    12
Run Code Online (Sandbox Code Playgroud)

我可以在一次手术中完成tb吗?执行此操作的最快方法是什么(因为我需要执行大约 500,000 行的此操作)?

Big*_*hao 4

您可以尝试链式.SD查询[][]

\n\n

我理解的问题是,首先更新一个新列,然后找到最小的 tdiff

\n\n
library(data.table)\ntb <- data.table(g_id=c(1, 1, 1, 2, 2, 2, 3),\n             item_no=c(24,25,26,27,28,29,30),\n             time_no=c(100, 110, 120, 130, 140, 160, 160),\n             key="g_id")\n\nts <- 118\n\n#\xe3\x80\x80My solution is quite simple\ntb[, tdiff := list(tdiff=abs(time_no - ts))][, .SD[which.min(tdiff)], by = key(tb)]\n
Run Code Online (Sandbox Code Playgroud)\n\n

我觉得.SD比较合适。您也可以使用更新:=

\n\n

这是输出:

\n\n
\n g_id item_no time_no tdiff\n1: 1 26 120 2\n2: 2 27 130 12\n3: 3 30 160 42\n
\n