【问题标题】:filtering within the summarise function of dplyr在 dplyr 的汇总函数中过滤
【发布时间】:2016-06-29 08:30:23
【问题描述】:

我对@9​​87654321@ 有点挣扎,因为我想同时做两件事,想知道这是否可能。

我想计算值的平均值,同时计算在另一列中具有特定值的值的平均值。

library(dplyr)
set.seed(1234)
df <- data.frame(id=rep(1:10, each=14),
                 tp=letters[1:14],
                 value_type=sample(LETTERS[1:3], 140, replace=TRUE),
                 values=runif(140))

df %>%
  group_by(id, tp) %>%
  summarise(
    all_mean=mean(values),
    A_mean=mean(values), # Only the values with value_type A
    value_count=sum(value_type == 'A')
  )

所以A_mean 列应该计算values 的平均值,其中value_count == 'A'

我通常会执行两个单独的命令并稍后合并结果,但我想有一个更方便的方法,我就是不明白。

提前致谢。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以试试

     df %>%
         group_by(id, tp) %>%
         summarise(all_mean = mean(values), 
                    A_mean = mean(values[value_type=="A"]),
                    value_count=sum(value_type == 'A'))
    

    【讨论】:

    • 又好又简单的解决方案!
    • 警告:如果您不明确过滤掉 NA,它们将被包括在内,因为 R 讨厌您。 A_mean = mean(values[value_type=="A" &amp; !is.na(value_type)])。在您的过滤器变量可能有您不想计算的 NA 的任何地方都包含此内容。
    • 或者更简单:drop_na(value_type) %&gt;% 在管道链的顶部。
    【解决方案2】:

    您可以通过两个摘要步骤来做到这一点:

    df %>%
      group_by(id, tp, value_type) %>%
      summarise(A_mean = mean(values)) %>%
      summarise(all_mean = mean(A_mean),
                A_mean = sum(A_mean * (value_type == "A")),
                value_count = sum(value_type == "A"))
    

    第一个摘要计算每个 value_type 的平均值,第二个“总和”仅计算 value_type == "A" 的平均值

    【讨论】:

      【解决方案3】:

      你也可以试试下面的函数:

      ?summarise_if
      

      (函数族为summarise_all

      示例

      dplyr documentation 是一个很好的例子,我认为:

      # The _if() variants apply a predicate function (a function that
      # returns TRUE or FALSE) to determine the relevant subset of
      # columns. Here we apply mean() to the numeric columns:
      
      starwars %>%
        summarise_if(is.numeric, mean, na.rm = TRUE)
      
      #> # A tibble: 1 x 3
      #>   height  mass birth_year
      #>    <dbl> <dbl>      <dbl>
      #> 1   174.  97.3       87.6
      

      这里有趣的是predicate 函数。这表示选择必须汇总的列的规则。

      【讨论】:

      • 你能举个例子吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 2017-03-19
      • 2016-11-13
      • 2021-10-14
      • 1970-01-01
      相关资源
      最近更新 更多