用于R

时间:2018-05-07 20:37:34

标签: r for-loop data.table vectorization

我有一个带有地点,开始日期和结束日期的数据集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)

1 个答案:

答案 0 :(得分:4)

您可以使用非equi联接来更新表格:

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=获得一些直觉。 {1}}等等。

相关问题