这似乎是一个琐碎的问题,我似乎找不到以下解决方案:
考虑两个 data.tables
library(data.table)
dt <- data.table(id = c(1,1,1,2,2,2),
val = c(10,20,30,10,20,30))
dt1 <- data.table(id = c(1,2),
V1 = c(2,1))
如何子集化dt
,哪里可以dt1
告诉我需要子集V1
化的分组的行号()id
?
例如,这里的结果将是
# id val
# 1: 1 20
# 2: 2 10
更新
对建议的解决方案进行快速基准测试
library(data.table)
s <- 100000
set.seed(123)
dt <- data.table(id = rep(seq(1:s), each=10),
val = rnorm(n = s*10, 0, 1))
dt1 <- data.table(id = seq(1:s),
V1 = sample(1:10, s, replace=T))
library(microbenchmark)
microbenchmark(
akrun = { dt[dt1, on='id'][, .SD[1:.N==V1] ,id] },
david = { dt[dt1, val[i.V1], on = 'id', by = .EACHI] },
symbolix = { dt[, id_seq := seq(1:.N), by=id][dt1, on=c(id_seq = "V1", "id") , nomatch=0] },
times = 5
)
#Unit: milliseconds
# expr min lq mean median uq max neval
# akrun 17809.51370 17887.89037 18005.32357 18043.80279 18130.78978 18154.62118 5
# david 48.17367 53.76436 53.79004 54.69096 55.59657 56.72467 5
#symbolix 507.67312 511.23492 562.59743 571.31160 579.61228 643.15525 5
另一种选择是在点播时使用by = .EACHI
以进行子集val
化
dt[dt1, val[i.V1], on = 'id', by = .EACHI]
# id V1
# 1: 1 20
# 2: 2 10
如果那里有更多列,则可以.SD[i.V1]
改用。
附带说明一下,在data.table v> = 1.9.8中,该.SD[val]
操作计划为完全优化以使用GForce,因此请耐心等待。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句