簡體   English   中英

通過除一個之外的所有字符變量聚合數據幀列表的所有數值變量

[英]Aggregating all numeric variables of a list of data frames by all character variables except one

我有一個數據框/小標題列表,如下所示:

library(tidyverse)

l <- list(capacity = tribble(~plant, ~month, ~max_capacity, ~min_capacity,
                             "A", "202001", 3000.0, 5000.0,
                             "A", "202002", 2000.0, 4500.0,
                             "B", "202001", 5000.0, 8000.0),
          demand = tribble(~region, ~month, ~demand,
                           "1", "202001", 234.3,
                           "1", "202002", 159.9,
                           "2", "202001", 488))

如何總結所有數字變量由除“月”之外的所有字符變量求和的所有數據框?

# want, but not in a dynamic way
l$capacity %>%
  group_by(plant) %>% # group by all character variables except "month"
  summarise(max_capacity = sum(max_capacity), min_capacity = sum(min_capacity)) %>%
    # summarise all numeric variables
  ungroup()

l$demand %>%
  group_by(region) %>%
  summarise(demand = sum(demand)) %>%
  ungroup()

我們可以使用Filtersetdiff找到要分組的列,將其傳遞給group_by_at接受字符串summarise_if並使用 summarise_if 對數字列求和。

library(dplyr)

purrr::map(l, ~{
   cols <- setdiff(names(Filter(is.character, .x)), 'month')
   .x %>% group_by_at(cols) %>% summarise_if(is.numeric, sum)
})

#$capacity
# A tibble: 2 x 3
#  plant max_capacity min_capacity
#  <chr>        <dbl>        <dbl>
#1 A             5000         9500
#2 B             5000         8000

#$demand
# A tibble: 2 x 2
#  region demand
#  <chr>   <dbl>
#1 1        394.
#2 2        488  

請注意, summarise_if很快將在across的較新版本中被替換為dplyr

暫無
暫無

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

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