dplyr:在for循环中获得分组的最小和最大列

EML*_*EML 3 r dplyr

我正在尝试使用 for 循环获取几列的分组最小值和最大值:

我的数据:

df <- data.frame(a=c(1:5, NA), b=c(6:10, NA), c=c(11:15, NA), group=c(1,1,1,2,2,2))
> df
   a  b  c group
1  1  6 11     1
2  2  7 12     1
3  3  8 13     1
4  4  9 14     2
5  5 10 15     2
6 NA NA NA     2
Run Code Online (Sandbox Code Playgroud)

我的尝试:

cols <- df %>% select(a,b) %>% names()

for(i in seq_along(cols)) {
  output <- df %>% dplyr::group_by(group) %>% 
             dplyr::summarise_(min=min(.dots=i, na.rm=T), max=max(.dots=i, na.rm=T))
  print(output)
}
Run Code Online (Sandbox Code Playgroud)

a 列的期望输出:

  group   min   max
  <dbl> <int> <int>
1     1     1     3
2     2     4     5
Run Code Online (Sandbox Code Playgroud)

Sve*_*enB 6

使用dplyr包,您可以获得:

df %>%
  na.omit() %>% 
  pivot_longer(-group) %>%
  group_by(group, name) %>%
  summarise(min = min(value),
            max = max(value)) %>%
  arrange(name, group)

# group name    min   max
# <dbl> <chr> <int> <int>
# 1     1 a         1     3
# 2     2 a         4     5
# 3     1 b         6     8
# 4     2 b         9    10
# 5     1 c        11    13
# 6     2 c        14    15
Run Code Online (Sandbox Code Playgroud)


akr*_*run 5

我们可以summarise_all在按“组”分组后使用,如果需要按特定顺序,则使用select根据列名进行选择

library(dplyr)
library(stringr)
df %>%
    group_by(group) %>% 
    summarise_all(list(min = ~ min(., na.rm = TRUE),
                       max = ~ max(., na.rm = TRUE))) %>%
    select(group, order(str_remove(names(.), "_.*")))
# A tibble: 2 x 7
#  group a_min a_max b_min b_max c_min c_max
#  <dbl> <int> <int> <int> <int> <int> <int>
#1     1     1     3     6     8    11    13
#2     2     4     5     9    10    14    15
Run Code Online (Sandbox Code Playgroud)