使用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
相关产品推荐
相关产品推荐

