dplyr中summarise函数中的筛选功能

26

我在使用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 列应计算 value_count == 'A'values 的平均值。

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

提前感谢。

3个回答

39

我们可以尝试

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

1
好的,简单易行的解决方案! - drmariod
2
警告:如果您不明确地过滤掉NA,它们将被包括在内,因为R讨厌您。A_mean = mean(values[value_type=="A" & !is.na(value_type)])。在您的过滤变量可能有您不想计算的NA的任何地方都要包含它。 - dez93_2000
2
或者更简单的方法:在管道链的顶部使用 drop_na(value_type) %>% - dez93_2000

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函数。它代表着用于选择将要被汇总的列的规则。

你能举个例子吗? - Braiam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接