[英]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.