You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用purrr映射国家代码时R代码长时间无输出问题排查

问题原因分析及优化建议

核心原因:低效的迭代逻辑与重复计算

你的代码持续无响应但不报错,大概率是以下问题叠加导致的性能灾难:

  • 重复计算冗余操作:如果new_function内部每次调用都重新从完整的un_votes数据集中筛选美国2000年以来的投票数据,每处理一个国家就会重复执行一次相同的筛选、匹配操作。几百个国家的情况下,这种重复计算会把时间复杂度拉到O(n²),计算量呈指数级增长。
  • 分组操作的无意义开销:用dplyr::group_by(country_code)后再调用purrr::map_vec,本质上是让每个分组独立遍历全量数据集做计算,分组操作不仅没起作用,反而额外增加了数据拆分、传递的开销。
  • 逐元素迭代的性能瓶颈:purrr::map_vec是逐元素迭代处理,而R的优势是向量化操作。针对百万级记录的un_votes数据集,逐行迭代的速度会比向量化操作慢几个数量级。

优化方案:用向量化操作替代逐元素迭代

直接通过dplyr的向量化计算一次性得出所有国家与美国的投票一致率,完全不需要purrr迭代,代码简洁且性能拉满:

library(unvotes)
library(dplyr)

# 提前预处理美国2000年以来的投票数据(仅执行一次)
us_votes_filtered <- un_votes %>%
  filter(country_code == "US", year >= 2000) %>%
  select(rcid, vote)

# 一次性计算所有国家与美国的投票一致率
top_3_countries <- un_votes %>%
  filter(year >= 2000) %>%
  # 关联美国的投票记录,确保只计算两国共同参与的投票
  inner_join(us_votes_filtered, by = "rcid", suffix = c("_country", "_us")) %>%
  group_by(country_code, country) %>%
  summarise(
    agreement_rate = mean(vote_country == vote_us, na.rm = TRUE),
    total_matched_votes = n(),
    .groups = "drop"
  ) %>%
  # 按一致率降序排序,取前3
  arrange(desc(agreement_rate)) %>%
  slice_head(n = 3)

print(top_3_countries)

这个方案的核心是:只做一次美国数据的筛选,通过inner_join对齐两国的投票记录,再用分组汇总一次性计算所有国家的一致率,彻底避免了重复计算和低效迭代。

内容的提问来源于stack exchange,提问作者joyjoylili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:05:01