我有一个数据集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)
您可以使用非等值联接来更新表:
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=
等的直觉。