gpt4 book ai didi

r - data.table 中键的顺序重要吗?

转载 作者:行者123 更新时间:2023-12-02 20:16:19 24 4
gpt4 key购买 nike

我有一个 data.table,它有两个键:Year(10 个级别)和 MemberID(200,000 个级别)。当我 setkey 时,setkey(MemberID, Year)setkey(Year, MemberID) 相比是否会产生不同的性能?如果可以的话,哪种方式会更好?

最佳答案

关键设置的性能和速度将取决于关键变量类型。 数字列将比整数慢。 字符列(当短字符串时)看起来很快。

例如

 library(data.table)

set.seed(1)
DIC <- data.table(year = sample(seq_len(10), 5e6, TRUE), id = sample(as.character(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6))
DIC2 <- copy(DIC)
DIF <- data.table(year = sample(seq_len(10), 5e6, TRUE), id = sample(as.factor(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6))
DIF2 <- copy(DIF)
DNC <- data.table(year = sample(as.numeric(seq_len(10)), 5e6, TRUE), id = sample(as.character(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6))
DNC2 <- copy(DNC)
DCC <- data.table(year = sample(as.character(seq_len(10)), 5e6, TRUE), id = sample(as.character(seq_len(2e5)), 5e6, TRUE), z = rnorm(5e6))
DCC2 <- copy(DCC)
DII <- data.table(year = sample(seq_len(10), 5e6, TRUE), id = sample(seq_len(2e5), 5e6, TRUE), z = rnorm(5e6))
DII2 <- copy(DII)
<小时/>

一些时间

# key of integer, character columns
system.time(setkey(DIC, year ,id))
user system elapsed
3.21 0.11 3.31
system.time(setkey(DIC2, id, year))
user system elapsed
3.43 0.03 3.45
# key of integer factor columns
system.time(setkey(DIF, year ,id))
user system elapsed
6.31 0.05 6.37
system.time(setkey(DIF2, id, year))
user system elapsed
6.44 0.06 6.54
# key of numeric, character columns
system.time(setkey(DNC, year ,id))
user system elapsed
9.91 0.07 10.29
system.time(setkey(DNC2, id, year))
user system elapsed
10.11 0.07 10.34
# key of two character columns
system.time(setkey(DCC, year ,id))
user system elapsed
3.34 0.05 3.40
system.time(setkey(DCC2, id, year))
user system elapsed
3.40 0.02 3.42
# key of two integer columns
system.time(setkey(DII, year ,id))
user system elapsed
6.25 0.02 6.53
system.time(setkey(DII2, id,year))
user system elapsed
6.44 0.05 6.64
<小时/>

至于哪种方式会更好。这可能取决于您最有可能更频繁地单独划分子集的内容。

例如,您可能需要获取第一年的所有数据。

如果您已将 key 设置为年份,id,那么您可以使用

D[J(1)]

但是如果键设置为id,year那么你需要

D[J(unique(id),1), nomatch = 0]

这需要更多的输入,并且需要更长的时间,因为它必须计算 unique(id)

有一个功能请求 FR#1007看起来允许使用辅助 key ,但这尚未实现。目前有一个键可以占据多个列。

关于r - data.table 中键的顺序重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13694406/

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