簡體   English   中英

在 R 中,如何在多個維度上匯總數據框

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

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