[英]In R , how to summarize data frame in multiple dimensions
有如下數據框raw_data
,我怎樣才能輕松地將其更改為wished_data
?
我目前知道group_by/summarise
數據服務時間(並添加變量),然后rbind
他們。 但這有點無聊,尤其是當變量比這個例子更多的時候。
我想知道,如果有類似情況的一般方法嗎? 謝謝!
library(tidyverse)
country <- c('UK','US','UK','US')
category <- c("A", "B", "A", "B")
y2021 <- c(17, 42, 21, 12)
y2022 <- c(49, 23, 52, 90)
raw_data <- data.frame(國家,類別,y2021,y2022)
我們可以使用data.table
的rollup/cube/groupingsets
library(data.table)
out <- rbind(setDT(raw_data), groupingsets(raw_data, j = lapply(.SD, sum),
by = c("country", "category"),
sets = list("country", "category", character())))
out[is.na(out)] <- 'TOTAL'
-輸出
> out
country category y2021 y2022
<char> <char> <num> <num>
1: UK A 17 49
2: US B 42 23
3: UK A 21 52
4: US B 12 90
5: UK TOTAL 38 101
6: US TOTAL 54 113
7: TOTAL A 38 101
8: TOTAL B 54 113
9: TOTAL TOTAL 92 214
或與cube
out <- rbind(raw_data, cube(raw_data,
j = .(y2021= sum(y2021), y2022=sum(y2022)), by = c("country", "category")))
out[is.na(out)] <- 'TOTAL'
我們可以使用 janitor 的 adorn_totals 函數。 get_totals 接受一個數據框和一列,並輸出帶有數字列總數的數據框,指定列的每一級都有一個這樣的行。 然后它提取總行數,並且由於 adorn_totals 可以重新排列列順序,因此使用 select 將順序恢復為原始順序,以便我們以后可以將多個實例綁定在一起。 然后,我們將原始數據幀和我們想要的每個總行數據幀綁定在一起。
library(dplyr)
library(janitor)
get_totals <- function(data, col) {
data %>%
group_by({{col}}) %>%
group_modify(~ adorn_totals(.)) %>%
ungroup %>%
filter(rowSums(. == "Total") > 0) %>%
select(any_of(names(data)))
}
bind_rows(
raw_data,
get_totals(raw_data, category),
get_totals(raw_data, country),
get_totals(raw_data)
)
給予:
country category y2021 y2022
1 UK A 17 49
2 US B 42 23
3 UK A 21 52
4 US B 12 90
5 Total A 38 101
6 Total B 54 113
7 UK Total 38 101
8 US Total 54 113
9 Total - 92 214
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.