【问题标题】:dealing with Large data frame in R处理R中的大数据框
【发布时间】:2014-11-28 20:20:37
【问题描述】:

我在 R 中有一个 270 万行和 22 列的数据框,大小为 388 MB。此数据框包含我想要子集的数据。事实上,我必须将其子集大约 100,000 次。做这个的最好方式是什么。现在我使用数据框,它太慢了。每次迭代大约需要 1 秒。谢谢你。这是玩具代码:

s<-c(100,100,100,800,800,6662,33565,265653262,266532)
p<-c(5,5,5,10,10,10,8,9,10)
name<-c("bob","bob","bob","ed","ed","ed","joe","frank","ted")
time<- as.POSIXct(as.character(c("2014-10-27 18:11:36 PDT","2014-10-27 18:11:37 PDT","2014-10-27 18:11:38 PDT","2014-10-27 18:11:39 PDT","2014-10-27 18:11:40 PDT","2014-10-27 18:11:41 PDT","2014-10-27 19:11:36 PDT","2014-10-27 20:11:36 PDT","2014-10-27 21:11:36 PDT")))
dat<- data.table(s,p,name,time)
dat #here is the data frame in reality it has 2.7 million rows and 22 cols

这里是子集。在这个玩具模型中,我只对子集执行一次,但是 实际上,我有一个循环 100k 次迭代,每次循环 100,5,bob,# 次都会改变

  result <- subset(dat,    as.numeric(s) == 100
                   &  p == 5
                   &  name  == "bob"
                   & time >= "2014-10-27 18:11:36 PDT"
                   & time <= "2014-10-27 18:12:00 PDT"
                   )
  result

如何使这个子集更快?我尝试了 data.table() 而不是 data.frame 但它仍然很慢

【问题讨论】:

  • 这与your other question 有何不同?为什么你必须子集 100k 次?您是否查看过splitting 数据?如果您必须对 10 万次进行子集化,那么您可能需要重新考虑您的流程。
  • 子集是要求的一部分。拆分数据有什么帮助?
  • 要加快速度,请查看 doParallel 包。根据您机器上的内核,您可以显着减少处理时间。如果你愿意,我可以举个例子。
  • @jason 一个例子会很棒。谢谢。

标签: r


【解决方案1】:

这是一个简单的 doParallel 示例:

library(doParallel)
data(iris)
species.split <- split(iris, iris$Species)
cl <- makeCluster(detectCores())
registerDoParallel(cl)

species.models <- foreach(i=species.split) %dopar% {
    m<-lm(i$Sepal.Length ~ i$Petal.Width*i$Petal.Length);
    return(m)
}

对您来说,它可能是您定义的不同子集上的 foreach,如下所示:

split=c('bob','james','jones')
foreach(i=split) %dopar% {
    result<-subset(dat,name==i)
    assign(paste0('dat',i),result)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-10
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    相关资源
    最近更新 更多