簡體   English   中英

在 dplyr 的匯總函數中過濾

[英]filtering within the summarise function of dplyr

我在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_count == 'A'

我通常會執行兩個單獨的命令並稍后合並結果,但我想有一種更方便的方法,但我只是不明白。

提前致謝。

我們可以試試

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

您可以通過兩個總結步驟來做到這一點:

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"的平均值

您還可以嘗試以下功能:

?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函數。 這表示選擇必須匯總的列的規則。

暫無
暫無

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

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