在 dplyr 的汇总函数中进行过滤

问题描述 投票:0回答:3

我在

dplyr
上有点挣扎,因为我想同时做两件事,想知道这是否可能。

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

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_type == 'A'

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

提前致谢。

r dplyr
3个回答
42
投票

我们可以尝试

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

1
投票

您可以通过两个摘要步骤来完成此操作:

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"

的平均值

-2
投票

您还可以尝试以下功能:

?summarise_if

(函数族是

summarise_all

示例

dplyr 文档提供了一个很好的例子,我认为:

# 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
函数。这表示选择必须汇总的列的规则。

© www.soinside.com 2019 - 2024. All rights reserved.