Как найти максимальные значения в каждой группе в R с помощью dplyr

avatar
carvalhosantos
1 июля 2021 в 16:43
51
4
0

Как создать новый сводной data.frame только с самыми большими значениями data.frame

Я попробовал код ниже, но результат оказался не таким, как я ожидал.

n<-c('A','B','C','A','B','C','A','B','C')
x1<-c(1,2,3,4,5,6,7,8,9)
x2<-c(9,8,7,4,5,6,1,2,3)

df<-data.frame(n, x1, x2)


df%>%
  group_by(n)%>%
  mutate('x1'=max('x1'), 'x2'=max('x2'))

i wanted this

n   X1  X2
A   7   9
B   8   8
C   9   7
Источник
IRTFM
1 июля 2021 в 16:44
2

Как правило, функции dplyr можно запутать, заключая имена столбцов в кавычки. И я не думаю, что mutate — правильный глагол dplyr для агрегации.

IRTFM
1 июля 2021 в 16:51
0

Если вы просмотрели страницу справки для mutate, а не разместили ответ, вы должны были увидеть ссылку на summarise в разделе «См. также».

Ответы (4)

avatar
ThomasIsCoding
1 июля 2021 в 19:56
1

A data.table опция

library(data.table)
setDT(df)[, Map(max, .SD), n]

дает

   n x1 x2
1: A  7  9
2: B  8  8
3: C  9  7
avatar
Baraliuh
1 июля 2021 в 16:47
3

Просто измените его на x1 = max(x1) без кавычек и замените mutate на summarise.

df%>%
    group_by(n)%>%
    summarise(x1=max(x1), x2=max(x2))
carvalhosantos
1 июля 2021 в 16:52
0

Я использую кавычки, когда имя R не распознается

Baraliuh
1 июля 2021 в 16:55
1

Да ну, это не то, что вы должны делать. См. ?mutate и ?summarise.

avatar
akrun
1 июля 2021 в 16:47
3

Мы можем использовать across с group_by

library(dplyr)
df %>%
    group_by(n) %>%
    summarise(across(everything(), max, na.rm = TRUE))

-выход

# A tibble: 3 x 3
  n        x1    x2
  <chr> <dbl> <dbl>
1 A         7     9
2 B         8     8
3 C         9     7

Или используйте aggregate в base R

aggregate(.~ n, df, max)
carvalhosantos
1 июля 2021 в 17:25
0

это нормально, но если мне нужно выбрать определенные столбцы

akrun
1 июля 2021 в 17:26
0

@carvalhosantos просто укажите с помощью любого из select-helpers c(x1, x2) или starts_with('x') и т. д.

avatar
Karthik S
1 июля 2021 в 16:47
4

Работает ли это:

library(dplyr)
df %>% group_by(n ) %>% summarise(across(x1:x2, max))
# A tibble: 3 x 3
  n        x1    x2
  <chr> <dbl> <dbl>
1 A         7     9
2 B         8     8
3 C         9     7
carvalhosantos
1 июля 2021 в 17:24
0

привет, этот разрешает, но будет ли он служить только для числа? и если у меня нет данных (NA)

Karthik S
1 июля 2021 в 17:27
1

@carvalhosantos, если в ваших данных есть NA, используйте: summarise(across(x1:x2, max, na.rm = TRUE))

carvalhosantos
2 июля 2021 в 01:00
0

я пытаюсь в моем реальном data.frame, но у меня есть ошибка: Erro: across()` должен использоваться только внутри глаголов dplyr. Запустите rlang::last_error(), чтобы узнать, где произошла ошибка.`

Karthik S
2 июля 2021 в 03:49
0

@carvalhosantos, summarise — это глагол dplyr, не знаю, почему вы получаете эту ошибку.