gpt4 book ai didi

r - 子集数据表的最快方法是什么?

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

在我看来,处理data.table的行/列子集的最快方法是使用join和nomatch选项。

这样对吗?

DT = data.table(rep(1:100, 100000), rep(1:10, 1000000))
setkey(DT, V1, V2)
system.time(DT[J(22,2), nomatch=0L])
# user system elapsed
# 0.00 0.00 0.01
system.time(subset(DT, (V1==22) & (V2==2)))
# user system elapsed
# 0.45 0.21 0.67

identical(DT[J(22,2), nomatch=0L],subset(DT, (V1==22) & (V2==2)))
# [1] TRUE

基于二进制搜索的快速联接也存在一个问题:我找不到一种方法来选择一维中的所有项目。

假设我以后要执行以下操作:
DT[J(22,2), nomatch=0]  # subset on TWO dimensions
DT[J(22,), nomatch=0] # subset on ONE dimension only
# Error in list(22, ) : argument 2 is empty

不必将键重新设置为仅一维(因为我处于循环状态,并且我不想每次都休息一下键)。

最佳答案

子集data.table的最快方法是什么?

使用基于二进制搜索的子集功能最快。请注意,该子集需要选项nomatch = 0L,以便仅返回匹配的结果。

如何仅用两个键集按一个键子集?

如果您在DT上设置了两个键,并且希望通过第一个键进行子集化,则只需在J(.)中提供第一个值,而无需为第二个键提供任何内容。那是:

# will return all columns where the first key column matches 22
DT[J(22), nomatch=0L]

如果相反,您想按第二个键进行子集设置,那么到目前为止,您必须为第一个键提供所有唯一值。那是:
# will return all columns where 2nd key column matches 2
DT[J(unique(V1), 2), nomatch=0L]

这也显示为 in this SO post。尽管我更喜欢 DT[J(, 2)]来处理这种情况,因为这似乎很直观。

还有一个待处理的功能请求 FR #1007用于实现辅助键,完成后将解决此问题。

这是一个更好的例子:
DT = data.table(c(1,2,3,4,5), c(2,3,2,3,2))
DT
# V1 V2
# 1: 1 2
# 2: 2 3
# 3: 3 2
# 4: 4 3
# 5: 5 2
setkey(DT,V1,V2)
DT[J(unique(V1),2)]
# V1 V2
# 1: 1 2
# 2: 2 2
# 3: 3 2
# 4: 4 2
# 5: 5 2
DT[J(unique(V1),2), nomatch=0L]
# V1 V2
# 1: 1 2
# 2: 3 2
# 3: 5 2
DT[J(3), nomatch=0L]
# V1 V2
# 1: 3 2

总之:
# key(DT) = c("V1", "V2")

# data.frame | data.table equivalent
# =====================================================================
# subset(DF, (V1 == 3) & (V2 == 2)) | DT[J(3,2), nomatch=0L]
# subset(DF, (V1 == 3)) | DT[J(3), nomatch=0L]
# subset(DF, (V2 == 2)) | DT[J(unique(V1), 2), nomatch=0L]

关于r - 子集数据表的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23755839/

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