gpt4 book ai didi

r - 按多列键的第三列子集 data.table

转载 作者:行者123 更新时间:2023-12-02 01:43:00 26 4
gpt4 key购买 nike

假设我有一个带有 3 列键的 data.table。例如,假设我们将时间嵌套在嵌套在学校中的学生中。

dt <- data.table(expand.grid(schools = 200:210, students = 1:100, time = 1:5),
key = c("schools", "students", "time"))

并说我想获取仅包含时间 5 的数据子集。我知道我可以使用 subset :
time.5 <- subset(dt, wave == 5)

或者我可以做一个矢量扫描:
time.5 <- dt[wave == 5]

但那些不是“data.table 方式”——我想利用二分搜索的速度。由于我的 key 中有 3 列,因此使用 unique如下产生不正确的结果:
dt[.(unique(schools), unique(students), 5)]

有任何想法吗?

最佳答案

你可以试试

 setkey(dt, time)
dt[J(5)]

all( dt[J(5)][,time]==5)
#[1] TRUE

基准
dt1 <- data.table(expand.grid(schools=200:450, students=1:600,time=1:50),
key=c('schools', 'students', 'time'))
f1 <- function(){dt1[time==5]}

f2 <- function(){setkey(dt1, time)
new.dt <- dt1[J(5)]
setkeyv(new.dt, colnames(dt1))
}

f3 <- function() {setkey(dt1, time)
dt1[J(5)]}


microbenchmark(f1(), f2(), f3(), unit='relative', times=20L)
#Unit: relative
#expr min lq mean median uq max neval cld
#f1() 3.188559 3.240377 3.342936 3.218387 3.224352 5.319811 20 b
#f2() 1.050202 1.083136 1.081707 1.089292 1.087572 1.129741 20 a
#f3() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 20 a

关于r - 按多列键的第三列子集 data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27351259/

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