【问题标题】:Using mean in dplyr chain with curly braces always returns NA在带有花括号的 dplyr 链中使用均值总是返回 NA
【发布时间】:2022-01-16 14:38:50
【问题描述】:

尝试创建一个简单的函数,通过 dplyr 链汇总选择的变量。这是我的尝试:

get_mutated_df <- function(data, outcome){
  {{data}} %>% group_by(speed) %>% 
  summarize(dist_mean = mean({{outcome}}, na.rm = T)) %>%
  print()
}

data(cars)
get_mutated_df(cars, "dist")

但是,这会返回一个 NAs:

# A tibble: 19 × 2
   speed dist_mean
   <dbl>     <dbl>
 1     4        NA
 2     7        NA
 3     8        NA
 4     9        NA

这样做的适当方法是什么?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    data 上没有{},将"" 删除到dist 将起作用。

    get_mutated_df <- function(data, outcome){
      data %>% group_by(speed) %>% 
        summarize(dist_mean = mean({{outcome}}, na.rm = T)) %>%
        print()
    }
    
    get_mutated_df(cars, dist)
    
       speed dist_mean
       <dbl>     <dbl>
     1     4       6  
     2     7      13  
     3     8      16  
     4     9      10  
     5    10      26  
     6    11      22.5
     7    12      21.5
     8    13      35  
     9    14      50.5
    10    15      33.3
    11    16      36  
    12    17      40.7
    13    18      64.5
    14    19      50  
    15    20      50.4
    16    22      66  
    17    23      54  
    18    24      93.8
    19    25      85 
    

    pre_ 事物的代码

    carss <- cars
    carss$pre_dist <- cars$dist
    
    get_mutated_df_2 <- function(data, outcome){
      outcome <- deparse(substitute(outcome))
      outcome <- paste0("pre_", outcome)
      outcome <- as.symbol(outcome)
      data %>% group_by(speed) %>% 
        summarize(dist_mean := mean({{outcome}}, na.rm = T)) %>%
        print()
    }
    get_mutated_df_2(carss, dist)
    
       speed dist_mean
       <dbl>     <dbl>
     1     4       6  
     2     7      13  
     3     8      16  
     4     9      10  
     5    10      26  
     6    11      22.5
     7    12      21.5
     8    13      35  
     9    14      50.5
    10    15      33.3
    11    16      36  
    12    17      40.7
    13    18      64.5
    14    19      50  
    15    20      50.4
    16    22      66  
    17    23      54  
    18    24      93.8
    19    25      85  
    

    【讨论】:

    • 你是对的!非常感谢。纠结这个太久了
    • 快速跟进,如果结果有一些像“pre”这样的前缀我会怎么做。我现在这样做的方式是:summarize(dist_mean = mean("pre_{{outcome}}", na.rm = T),它仍在返回 NAs
    • @Parseltongue 很抱歉,我无法理解 outcome 有一些前缀,例如“pre” 部分。是否存在pre_dist 列?
    • 是的,已有一个名为pre_dist 的列。看来你不能在mean 函数中使用整洁的胶水语法
    • @Parseltongue 我在上面添加了pre 的代码。
    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 2012-01-10
    • 2019-03-19
    • 1970-01-01
    相关资源
    最近更新 更多