簡體   English   中英

如何在dplyr管道中將變量名稱傳遞給條件求和?

[英]How do I pass a variable name to conditionally sum in dplyr pipe?

問題的關鍵是如何將列變量傳遞到分組df中以有條件地對數據求和。 該示例的數據如下:

library(dplyr)
library(rlang)
set.seed(1)

# dummy dates
date_vars <- purrr::map(c('2018-01-31', '2018-02-28', '2018-03-31', 
                         '2018-04-30', '2018-05-31', '2018-06-30', 
                         '2018-07-31', '2018-08-31', '2018-09-30', 
                         '2018-10-31', '2018-11-30', '2018-12-31'), as.Date) %>% 
  purrr::reduce(c)

dummy_df <- tibble(

  id = rep(c("a", "b", "c"), each =  12),
  date = rep(date_vars, 3),
  value = runif(36, 1, 10)

)

下面的函數將采用數據框,按變量分組(使用rlang的sym函數),然后通過添加日期大於或等於某個日期周期的所有值來創建新的摘要列。 在這里,我總結了3個月的“價值觀”。

agg_by_period <- function(df, date_period, period, grouping, new_col_prefix){

  grouping_vars <- syms(grouping)

  new_sum_column <- quo_name(paste0(new_col_prefix, "sum_", period, 'm'))

  df %>% 
    group_by(!!!grouping_vars) %>% 
    summarize(!!new_sum_column := sum(value[date >= date_period], na.rm = T)) %>% 
    select(!!!grouping_vars, !!sym(new_sum_column))

}


agg_by_period(df = dummy_df, 
              date_period = as.Date('2018-10-31'), 
              grouping = 'id',
              period = 3,
              new_col_prefix = 'new_'
)


# A tibble: 3 x 2
  id    new_sum_3m
  <chr>      <dbl>
1 a           7.00
2 b          11.9 
3 c          18.1 


大! 我的問題是特定的,當這個列被命名為“值”以外的東西時,在函數動態中使'value'。 我使用sym()傳遞此列的天真嘗試及其錯誤如下:



agg_by_period2 <- function(df, date_period, period, grouping, new_col_prefix, 
                          value_var){

  grouping_vars <- syms(grouping)

  new_sum_column = quo_name(paste0(new_col_prefix, "sum_", period, 'm'))

  value_var_col <- sym(value_var)

  df %>% 
    group_by(!!!grouping_vars) %>% 
    summarize(!!new_sum_column := sum(!!value_var_col[date >= date_period], na.rm = T)) %>% 
    select(!!!grouping_vars, !!sym(new_sum_column))

}


agg_by_period2(df = dummy_df, 
              date_period = as.Date('2018-10-31'), 
              grouping = 'id',
              period = 3,
              new_col_prefix = 'new_',
              value_var = 'value'
)

 Error in `>=.default`(date, date_period) : 
  comparison (5) is possible only for atomic and list types 

刪除日期條件([date> = date_period])時,上述功能將起作用。 任何幫助將不勝感激。

這似乎是一個操作順序問題!! [ 看起來你只需要將拼接包裹在括號中

  df %>% 
    group_by(!!!grouping_vars) %>% 
    summarize(!!new_sum_column := sum((!!value_var_col)[date >= date_period], na.rm = T)) %>% 
    select(!!!grouping_vars, !!sym(new_sum_column))

注意(!!value_var_col)而不僅僅是!!value_var_col 這種拼接將在子集化之前發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM