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

在R语言中,基于外部向量创建新行的哪种方法更快?

行复制场景:tidyr::expand vs dplyr::reframe 速度对比

当我们需要复制行以适配长度大于1的外部向量时,典型场景是引入新日期维度,或是让每个日期对应不同个体。比如要为iris数据集生成每月测量数据,有两种等效实现方式:

方法1:使用tidyr::expand

group_and_tidyr_expand <- function(df){
  df %>% 
    group_by(pick(everything())) %>% 
    tidyr::expand(date = seq.Date(from = as.Date("2022-01-01"), to = as.Date("2023-01-01"), by = "1 month")) %>% 
    ungroup()
}

方法2:使用dplyr::reframe

group_and_reframe <- function(df){
  df %>% 
    group_by(pick(everything())) %>% 
    reframe(date = seq.Date(from = as.Date("2022-01-01"), to = as.Date("2023-01-01"), by = "1 month"))
}

注:reframe无需额外调用ungroup(),因为它默认会对输出取消分组。

速度对比结论

通过microbenchmark包的重复测试(以iris数据集为例,重复100次),dplyr::reframe的执行速度明显快于tidyr::expand。

原因在于:reframe是dplyr专为分组后多行输出场景设计的优化函数,内部实现逻辑更精简;而expand需要先构建扩展数据框架再处理分组关联,加上额外的ungroup()步骤,整体流程的冗余操作更多,导致效率稍低。

测试代码参考:

library(microbenchmark)
library(dplyr)
library(tidyr)

# 执行测试
benchmark_result <- microbenchmark(
  expand_method = group_and_tidyr_expand(iris),
  reframe_method = group_and_reframe(iris),
  times = 100
)

print(benchmark_result)

内容的提问来源于stack exchange,提问作者Alberto Agudo Dominguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:13:25