【发布时间】:2014-08-20 14:51:11
【问题描述】:
有没有更快的方法来进行快速条件选择? 将 data.frame 转换为另一种类型可能更好? 在这个测试版本中,我有大约 70 万行,但可能是数百万行?
我想知道基准测试,因为一切都在内存中。 替代方法可能是通过 db 进行一些额外的工作(ddl、索引)。
> str(df.test)
'data.frame': 694118 obs. of 4 variables:
$ uid : chr "ZyVOZrPOXwkuGSPv" "qBwuxhbrszRcISSRmIlYaQXHRUZE" "azCESULsUinrAeFkGIjEZpOLhrJcnB" "yLXPfpGlnLrtKmCRERj" ...
$ g1 : chr "group_70" "group_85" "group_150" "group_32" ...
$ g2 : chr "D" "A" "A" "C" ...
$ value: num 0.7756 0.1389 0.8924 0.2278 0.0709 ...
> df.test[200,]
uid g1 g2 value
200 appoBThmLxqFTyjFWyAqzsyJh group_2 E 0.604
>
> benchmark(replications = 100,df.test[(df.test$uid=='appoBThmLxqFTyjFWyAqzsyJh') &
+ (df.test$g1 == 'group_2') &
+ (df.test$g2 == 'E'),'value'])
test replications elapsed relative user.self sys.self user.child sys.child
1 df.test[(df.test$uid == "appoBThmLxqFTyjFWyAqzsyJh") & (df.test$g1 == "group_2") & (df.test$g2 == "E"), "value"] 100 10.72 1 10.713 0.007 0 0
>
> benchmark(replications = 100,subset(df.test,uid=='appoBThmLxqFTyjFWyAqzsyJh' & g1 == 'group_2' & g2== 'E' ))
test replications elapsed relative user.self sys.self user.child sys.child
1 subset(df.test, uid == "appoBThmLxqFTyjFWyAqzsyJh" & g1 == "group_2" & g2 == "E") 100 18.987 1 18.993 0 0 0
>
> library(data.table)
> dt.test <- data.table(df.test)
> benchmark(replications = 100,dt.test[(uid=='appoBThmLxqFTyjFWyAqzsyJh') &
+ (g1 == 'group_2') &
+ (g2 == 'E'),value])
test replications elapsed relative user.self sys.self user.child sys.child
1 dt.test[(uid == "appoBThmLxqFTyjFWyAqzsyJh") & (g1 == "group_2") & (g2 == "E"), value] 100 10.376 1 10.374 0.002 0 0
> setkey(dt.test,uid,g1,g2)
> #rm(dt.test)
> benchmark(replications = 100,dt.test[(uid=='appoBThmLxqFTyjFWyAqzsyJh') &
+ (g1 == 'group_2') &
+ (g2 == 'E'),value])
test replications elapsed relative user.self sys.self user.child sys.child
1 dt.test[(uid == "appoBThmLxqFTyjFWyAqzsyJh") & (g1 == "group_2") & (g2 == "E"), value] 100 13.244 1 13.261 0 0 0
【问题讨论】:
-
用data.table 标记此内容,因为您还在问题中比较了“data.table”方法。
标签: r performance dataframe selection data.table