簡體   English   中英

使用dplyr在多個語句中添加匯總變量?

[英]Add summarize variable in multiple statements using dplyr?

在 dplyr 中, group_by 有一個參數add ,如果為真,則添加到 group_by 中。 例如:

data <- data.frame(a=c('a','b','c'), b=c(1,2,3), c=c(4,5,6))
data <- data %>% group_by(a, add=TRUE)
data <- data %>% group_by(b, add=TRUE)
data %>% summarize(sum_c = sum(c))

輸出:

  a         b sum_c
1 a         1     4
2 b         2     5
3 c         3     6

是否有類似的方法將匯總變量添加到匯總語句中? 我有一些復雜的條件(使用dbplyr ),如果x=TRUE我想將變量x_v添加到摘要中。

我看到了幾個相關的 stackoverflow 問題,但我沒有看到。

編輯:這是一些精確的示例代碼,但從實際代碼(有兩個以上的條件)簡化。

summarize_num <- TRUE
summarize_num_distinct <- FALSE

data <- data.frame(val=c(1,2,2))

if (summarize_num && summarize_num_distinct) {
  summ <- data %>% summarize(n=n(), n_unique=n_distinct())
} else if (summarize_num) {
  summ <- data %>% summarize(n=n())
} else if (summarize_num_distinct) {
  summ <- data %>% summarize(n_unique=n_distinct())
}

根據條件(此處為 summarize_num 和 summarize_num_distinct),最終匯總(此處為 summ)具有不同的列。

隨着條件數量的增加,子句的數量組合地增加。 但是,條件是獨立的,所以我也想獨立添加匯總變量。

我正在使用dbplyr ,因此我必須以一種可以將其轉換為 SQL 的方式進行操作。

這對你的情況有用嗎? 在這里,我們使用 mutate 為每個請求的求和添加一列。 它在計算上很浪費,因為它對每組中的每一行進行一次相同的求和,然后丟棄除每組第一行之外的所有內容。 但如果您的數據不是太大,那可能沒問題。

data <- data.frame(val=c(1,2,2), grp = c(1, 1, 2)) # To show it works within groups

summ <- data %>% group_by(grp)
if(summarize_num) {summ = mutate(summ, n = n())}
if(summarize_num_distinct) {summ = mutate(summ, n_unique=n_distinct(val))} 
summ = slice(summ, 1) %>% ungroup() %>% select(-val)

## A tibble: 2 x 3
#    grp     n n_unique
#  <dbl> <int>    <int>
#1     1     2        2
#2     2     1        1

summarise_at()函數將函數列表作為參數。 所以,我們可以得到

data <- data.frame(val=c(1,2,2))

fcts <- list(n_unique = n_distinct, n = length)
data %>% 
  summarise_at(.vars = "val", fcts)
 n_unique n 1 2 3

列表中的所有函數都必須采用一個參數。 因此, n()length()取代。

可以根據 OP 的要求動態修改函數列表,例如,

summarize_num_distinct <- FALSE
summarize_num <- TRUE
fcts <- list(n_unique = n_distinct, n = length)
data %>% 
  summarise_at(.vars = "val", fcts[c(summarize_num_distinct, summarize_num)])
 n 1 3

因此,我們的想法是定義一個可能的聚合函數列表,然后動態選擇要計算的聚合。 甚至可以確定聚合中列的順序:

fcts <- list(n_unique = n_distinct, n = length, sum = sum, avg = mean, min = min, max = max)
data %>% 
  summarise_at(.vars = "val", fcts[c(6, 2, 4, 3)])
 max n avg sum 1 2 3 1.666667 5

暫無
暫無

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

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