我有一个非常大的数据框 (df0
),其中一个省份列有 12 个独特的省份,另一个政党列为空 (NAs
)。我有另一个数据框(votes
),其中每个省的每个政党都有一行,以及投票给它的人数比例。下面是一个最小的例子:
df0 = data.frame(geo_prov = rep(c("prov_a","prov_b","prov_c"), each = 100),
party = NA)
votes = data.frame(geo_prov = rep(c("prov_a","prov_b","prov_c"), each = 3),
party = rep(c("party_a","party_b","party_c"), times = 3),
prop = c(0.5,0.3,0.2,
0.1,0.7,0.2,
0.2,0.1,0.7))
我现在想要在df0$party
列中填写政党,以便对于每个省份,填写的政党比例等于投票
中的比例> df。我的代码可以工作(见下文),但在大型数据集(1300 万条记录,20 个参与方)上速度非常慢。
for(prov in unique(df0$geo_prov)){
n_prov = nrow(df0[df0$geo_prov == prov,])
vote_freqs = c()
for(party in unique(votes$party)){
vote_freqs = c(vote_freqs, rep(party, each = floor(votes[votes$geo_prov == prov & votes$party == party,]$prop*n_prov)))
}
df0$party[df0$geo_prov == prov] = vote_freqs
}
我想改进代码以加快速度。非常感谢!
最佳答案
Dplyr
和 Data.table
因速度快和占用内存最少而闻名。有些可以argue那个比另一个更好,但我相信两者都有各自的优势和 flavor 。以下是解决您问题的 data.table
方法。
library(data.table)
# Calculate the 'pct' column in df0 while dropping 'party'
df0[, pct := rowid(geo_prov) / .N, by = geo_prov]
df0[, party := NULL]
# Calculate the cumulative sum in votes
votes[, cuml := cumsum(prop), by = geo_prov]
# Perform the left join
result <- df0[votes[pct <= cuml, closest(.I)], on = "geo_prov"]
关于r - 加速 R 代码以基于其他数据帧用字符串填充向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77470909/