r - 加速 R 代码以基于其他数据帧用字符串填充向量

标签 r performance dplyr

我有一个非常大的数据框 (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
  
}

我想改进代码以加快速度。非常感谢!

最佳答案

DplyrData.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/

相关文章:

r - 如何在使用 plyr 时避免重复代码

performance - 快速平面适合多点

r - 用 dplyr 创建 t.test 表?

r - R 中数据帧列的动态变异,无法弄清楚如何使用函数或循环

r - ggplot2:向网格添加对角线

r - R中的highchart内部循环

r - 将 Git 日志 numstats 解析到 R 表中

java - 拥有一个字符串,替换然后执行拆分或拥有一组字符串并创建一个新的字符串来更改它会更有效吗?

sql-server - 如何在不重复分片的情况下扩展数据库中的写入?

r - 安装旧包 R