gpt4 book ai didi

r - 给定每个组的行索引,对 data.table 进行子集

转载 作者:行者123 更新时间:2023-12-04 11:38:38 24 4
gpt4 key购买 nike

这似乎是一个微不足道的问题,我似乎无法找到解决方案:

考虑两个 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-所以请抓紧。

关于r - 给定每个组的行索引,对 data.table 进行子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36054710/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com