【问题标题】:Vectorization of for-loop for calculations between two datasets in RR中两个数据集之间计算的for循环向量化
【发布时间】:2018-05-07 20:37:33
【问题描述】:

我有一个数据集 A,其中包含地点、开始日期和结束日期。另一方面,我有一个数据集 B,其中还包含地点、日期和汽车数量。

library(data.table)
A <- data.table(Place = c(rep(c("Place_1","Place_2"), each = 20)),
          Start_date = as.Date("2010-01-15"),
          Finish_date = as.Date(rep(c("2011-03-01","2012-04-30","2012-01-20","2011-04-05"), each = 10)))


set.seed(1001)
B <- data.table(Date = rep(seq.Date(from = as.Date("2010-01-01"), to = as.Date("2013-01-01"), by="day"), 2),
          Place = rep(c("Place_1","Place_2"),each = 1097),
          Cars = round(runif(2194, 0, 10), 0))    

我需要在数据集 A 中计算一个新列(汽车总数),它是数据集 B 中汽车的总和;这个数量的汽车必须是针对特定地点和特定时间段的。

这很容易用 for 循环语句完成。

for (i in 1:nrow(A)) {
    A$Tcars[i] <- sum(B[Place == A$Place[i] & Date > A$Start_date[i] & Date < A$Finish_date[i]]$Cars)
}

但我的真实数据集有 30.000 行,并且循环选项效率低下且耗时。所以,我正在寻找一种矢量化的方式来做到这一点。我已经尝试了下一个代码,但它不起作用:

A$Tcars<-sum(B[Place == A$Place & Date > A$Start_date & Date < A$Finish_date]$Cars)

【问题讨论】:

    标签: r for-loop data.table vectorization


    【解决方案1】:

    您可以使用非等连接来更新表:

    library(data.table)
    
    A[, n := B[.SD, on=.(Place, Date > Start_date, Date < Finish_date), 
      sum(Cars), by=.EACHI]$V1]
    

    如果您查看?data.table 和第一次输入library(data.table) 时列出的其他介绍性材料,您将获得:=on=by= 等的一些直觉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-20
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 2019-06-17
      • 1970-01-01
      • 2020-01-29
      相关资源
      最近更新 更多