【发布时间】:2020-09-29 04:37:24
【问题描述】:
所以在充分解释之前需要一些背景知识。我有一份美国各县之间的距离清单,以及天数。我需要每个县,每天该县与其他县之间的距离总和。因此,例如,如果有四个县,A、B、C 和 D,以及 10 天,我想要距离 AB+AC+AD(A 与其他每个县之间的距离之和)BA+BC+BD, CA+CB+CD,10 天中的每一天。我知道这在断章取义的情况下听起来很奇怪,但如果不充分解释我的研究,就很难解释为什么。
所以对于一个reprex。考虑 3 个县和 3 天。
dist <- runif(9)
source <- c("A", "A", "A", "B", "B", "B", "C", "C", "C")
dest <- rep(c("A", "B", "C"), 3)
a
d1 <- as.data.frame(cbind(dest, source, dist))
d1$dist[b == c] <- 0
d1
county <- c("A", "A", "A", "B", "B", "B", "C", "C", "C")
lockdown <- c(0, 1, 0, 1, 1, 0, 1, 0, 1)
day <- c(1, 2, 3)
day <- rep(day, 3)
d2 <- as.data.frame(cbind(day, county, lockdown))
这给了我们:
+------+--------+-------------------+--+--+
| | | | | |
+------+--------+-------------------+--+--+
| dest | source | dist | | |
| A | A | 0 | | |
| B | A | 0.815869745099917 | | |
| C | A | 0.554592022672296 | | |
| A | B | 0.193494795123115 | | |
| B | B | 0 | | |
| C | B | 0.708462748210877 | | |
| A | C | 0.729813229991123 | | |
| B | C | 0.351678870152682 | | |
| C | C | 0 | | |
+------+--------+-------------------+--+--+
这是三个县之间的距离表。
然后我每天都有一些县的面板数据:
+-----+--------+----------+--+--+
| day | county | lockdown | | |
+-----+--------+----------+--+--+
| 1 | A | 0 | | |
| 2 | A | 1 | | |
| 3 | A | 0 | | |
| 1 | B | 1 | | |
| 2 | B | 1 | | |
| 3 | B | 0 | | |
| 1 | C | 1 | | |
| 2 | C | 0 | | |
| 3 | C | 1 | | |
+-----+--------+----------+--+--+
现在我想遍历县,并在 d2 中创建一个列,其中包含 该县与未处于锁定状态的其他县之间的距离总和。 所以如果 B、C 和 D 在那一天没有处于锁定状态,则认为 AB+AC+AD。我使用这样的循环:
# these aren't numeric for some reason
d1$dist <- as.numeric(d1$dist)
d2$lockdown <- as.numeric(d2$lockdown)
# First loop over the source counties
for (i in unique(d1$source)) {
# Next loop over the days
for (j in unique(d2$day)) {
# finally, for each destination county, fill in the entry in d2 with the sum of the distance times if the county is in lockdown
for (k in unique(d1$dest)) {
ifelse(i == k, d2$ma[d2$county == i & d2$day == j] <- d2$ma[d2$county == i & d2$day == j],
d2$ma[d2$county == i & d2$day == j] <- d2$ma[d2$county == i & d2$day == j] + d1$dist[d1$source == i & d1$dest == k] * d2$lockdown[d2$day == j & d2$county == i]
)
}
}
}
这适用于如此小的数据集,但有 3000 个县,150 天需要循环超过十亿次迭代。有没有办法更有效地编写这个循环?我尝试使用矢量化表示法,但由于需要以新列的形式将输出与 d2 匹配,因此实际上并不可行。
【问题讨论】: