【发布时间】:2019-12-05 23:14:29
【问题描述】:
我有一个很大的 data.frame(50M 行),需要找到与多列条件匹配的索引。
我做了一个玩具例子来说明这个问题。
我读到 here 说搜索 data.tables 比搜索 data.frames 更快,所以我将 data.frame 转换为 data.table 对象
cases<-c(1,3,5)
women<-c("Julia", "Judith", "Juno", "Jane", "Joanna")
data.df<-data.frame("id" = 1:5, "age" = c(20, 30, 40, 50, 60), "name" = c("Joanna","Joe", "Julia", "Juno", "John"))
library(data.table)
data.dt<-as.data.table(data.df)
setkey(data.dt, "id")
我希望结果向量包含通过多列标准的记录的年龄值,在本例中为 20、40、NA。我使用 for 循环进行搜索(这可能是一种愚蠢的方法,任何提示将不胜感激)
results<-vector()
for (i in 1:length(cases)){
which_id<-cases[i]
ind<-data.dt[id==which_id & name %in% women, which=TRUE]
if(length(ind)==0){results[i]<-NA}
else{results[i]<-data.dt$age[ind]}
}
这适用于较小的数据集,但在 case 中有 500K 记录,在 data.df 中有 50M 时,运行需要超过 12 小时。一定有更简单的方法,谁能给个提示?
【问题讨论】:
-
你要
data.dt[J(cases)][name %in% women] -
阅读小插图后,我发现我使用 data.tables 的方式与使用 data.frame 的方式相同
标签: r performance dataframe search data.table