如何用Base R 4.3原生管道替代dplyr筛选首个realtime_period?
使用Base R原生管道筛选UNRATE的首个修订观测值
解决方案代码
以下是两种符合Base R 4.3.3原生管道语法的实现方式,逻辑与你的dplyr代码完全一致:
方法一:利用ave()分组标记筛选
df |> transform(Delta = realtime_period - date) |> (\(x) x[ave(x$Delta, x$date, FUN = function(v) v == min(v)), ])() |> subset(select = -Delta)
方法二:Split-Apply-Combine模式
df |> transform(Delta = realtime_period - date) |> split(f = ~ date) |> lapply(\(grp) grp[grp$Delta == min(grp$Delta), ]) |> do.call(rbind, args = _) |> subset(select = -Delta)
代码说明
- 用Base R的
transform()替代mutate(),计算日期差Delta - 方法一通过
ave()按date分组,生成逻辑标记筛选出每组中Delta最小的行 - 方法二先按
date拆分数据,对每组筛选目标行后再合并结果 - 最后用
subset()移除临时生成的Delta列,还原数据结构
背景与原有实现
数据获取
使用alfred包从美联储下载UNRATE月度失业率数据:
df <- alfred::get_alfred_series("UNRATE")
数据说明
数据包含每个统计日期的原始及修订观测值,以及修订发布日期,示例如下:
> head(df) date realtime_period UNRATE 1 1948-01-01 1960-03-15 3.5 2 1948-02-01 1960-03-15 3.8 3 1948-03-01 1960-03-15 4.0 4 1948-04-01 1960-03-15 4.0 5 1948-05-01 1960-03-15 3.6 6 1948-06-01 1960-03-15 3.8
已有的dplyr实现
原使用tidyverse完成需求的代码:
df |> mutate(Delta = realtime_period - date) |> group_by(date) |> filter(Delta == min(Delta)) |> ungroup()
内容的提问来源于stack exchange,提问作者Thomas Philips
相关产品推荐
相关产品推荐

