Как найти минимум и максимум во многих строках для одного значения - PullRequest
0 голосов
/ 18 января 2019

У меня есть следующий набор данных:

Class     
A       5     9     2     6
A       13    8     
A       4     8     3     10    6
B       12    5     11     
B       7     1     17    6     8     1

Я хочу найти максимальное и минимальное значение для каждого класса во всех строках, которые связаны с этим классом. В этом случае я должен получить:

Class    Max    Min
A        13     2
B        33     1

Обратите внимание, что значения не имеют заголовков.

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Используя данные, предоставленные @G. Grothendieck, tidyverse возможность:

DF %>%
 gather(var, val, -Class) %>%
 group_by(Class) %>%
 summarise(Max = max(val, na.rm = TRUE),
        Min = min(val, na.rm = TRUE))

   Class   Max   Min
  <chr> <dbl> <dbl>
1 A       13.    2.
2 B       17.    1.

Преобразует данные из широких в длинные и определяет минимальное и максимальное значение для «Класса».

Или:

cols <- names(DF)[2:length(DF)]

DF %>% 
 group_by(Class) %>%
 summarise(Max = max(pmax(c(!!! rlang::syms(cols)), na.rm = TRUE), na.rm = TRUE),
        Min = min(pmin(c(!!! rlang::syms(cols)), na.rm = TRUE), na.rm = TRUE))

Во-первых, он определяет столбцы, которые вы хотите обобщить. Затем он суммирует максимум и минимум построчного максимума и минимума.

Или:

cols <- names(DF)[2:length(DF)]

DF %>% 
 rowwise() %>%
 mutate(Max = max(c(!!! rlang::syms(cols)), na.rm = TRUE),
        Min = min(c(!!! rlang::syms(cols)), na.rm = TRUE)) %>%
 group_by(Class) %>%
 summarise(Max = max(Max, na.rm = TRUE),
           Min = min(Min, na.rm = TRUE))

Во-первых, он определяет столбцы, которые вы хотите обобщить. Во-вторых, он вычисляет построчный максимум и минимум выбранных столбцов. В-третьих, он группируется по «Классу» и суммирует максимум и минимум построчного максимума и минимума.

0 голосов
/ 19 января 2019

Предполагая, что ввод DF воспроизводимо показан в примечании в конце:

min.max <- do.call("rbind", by(DF[-1], DF[[1]], range, na.rm = TRUE))
colnames(min.max) <- c("min", "max")
min.max

давая эту матрицу:

  min max
A   2  13
B   1  17

Примечание

Lines <- "
A       5     9     2     6
A       13    8     
A       4     8     3     10    6
B       12    5     11     
B       7     1     17    6     8     1"
DF <- read.table(text = Lines, as.is = TRUE, fill = TRUE)
names(DF)[1] <- "Class"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...