假设我下面有一些随时间和位置变化的数据

library(tidyverse)

dts <- seq(
  ymd_hms('2023-01-01 00:00:00'),
  ymd_hms('2025-01-01 00:00:00'),
  by = '1 min'
)

locs <- tribble(
  ~'continent', ~'country', ~'city',
  'NA', 'CA', 'Toronto',
  'NA', 'US', 'Los Angeles',
  'EU', 'UK', 'London',
  'EU', 'FR', 'Paris'
)


d <- crossing(locs, dates=dts) %>% 
     mutate(
       second = second(dates),
       min = minute(dates),
       hour = hour(dates),
       yday = yday(dates),
       month = month(dates, label=T),
       y = runif(n())
     )

创建于2024-02-18年第reprex v2.0.2

我的目标是创建一个名为rollup的函数,用户可以按时间维度和位置维度进行分组. 理想情况下,用户可以传递参数,如

rollup(d, time_dims = c(year, month), loc_dims = c(country))

而输出结果将是

    d %>%
      group_by(all the variables in loc dims and time dims) %>% 
      summarise(y = mean(y))

如果参数是字符向量,这就很简单了

rollup <- function(.data, time_dims, loc_dims) {
  
    .data %>% 
      group_by_at(c(time_dims, loc_dims)) %>% 
      summarise(y = mean(y))
  
}

rollup(d, time_dims = c('min', 'hour'), loc_dims = c('country'))
`summarise()` has grouped output by 'min', 'hour'. You can override using the
`.groups` argument.
# A tibble: 5,760 × 4
# Groups:   min, hour [1,440]
     min  hour country     y
   <int> <int> <chr>   <dbl>
 1     0     0 CA      0.496
 2     0     0 FR      0.514
 3     0     0 UK      0.500
 4     0     0 US      0.504
 5     0     1 CA      0.511
 6     0     1 FR      0.509
 7     0     1 UK      0.489
 8     0     1 US      0.505
 9     0     2 CA      0.486
10     0     2 FR      0.484
# ℹ 5,750 more rows
# ℹ Use `print(n = ...)` to see more rows

如果我想传递一个符号数组,比如pivot_longer可以接受,该怎么办?如何修改rollup以接受time_dimsloc_dims的符号数组?

推荐答案

您可以在group_by()中使用across()来在函数中使用tidyselect语义:

library(dplyr)

rollup <- function(.data, time_dims = NULL, loc_dims = NULL) {
  
  .data %>% 
    group_by(across(c({{time_dims}}, {{loc_dims}}))) %>% 
    summarise(y = mean(y), .groups = "drop")
  
}

rollup(d, time_dims = c(hour, min), loc_dims = country)

# A tibble: 5,760 × 4
    hour   min country     y
   <int> <int> <chr>   <dbl>
 1     0     0 CA      0.487
 2     0     0 FR      0.504
 3     0     0 UK      0.501
 4     0     0 US      0.492
 5     0     1 CA      0.500
 6     0     1 FR      0.512
 7     0     1 UK      0.504
 8     0     1 US      0.491
 9     0     2 CA      0.492
10     0     2 FR      0.486
# ℹ 5,750 more rows
# ℹ Use `print(n = ...)` to see more rows

R相关问答推荐

如何在弹性表中为类别值的背景上色

如果行和列名以相同的开头,将矩阵值设置为0

bslib::card_header中的shine::downloadButton,图标而不是文本

如何使下一个按钮只出现在Rshiny 的一段时间后?""

在R中使用数据集名称

如何在一次运行中使用count进行多列计数

R中边际效应包中Logistic回归的交互作用风险比

给定开始日期和月份(数字),如何根据R中的开始日期和月数创建日期列

如何在科学记数法中显示因子

TreeNode打印 twig 并为其上色

有没有可能用shiny 的书签恢复手风琴面板?

来自程序包AFEX和amp;的类/函数和NICE_TABLE&冲突

如何将一列中的值拆分到R中各自的列中

计算使一组输入值最小化的a、b和c的值

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

以R表示的NaN值的IS.NA状态

R,将组ID分配给另一个观测ID变量中的值的组合

为什么R列名称忽略具有指定名称的向量,而只关注索引?

对计算变量所有唯一值的变量进行变异

Gggvenn为Venn增加了不存在的价值