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

Самый сжатый способ, который не упоминается ни в одном из других ответов, вероятно, следующий:

>>> d = {2:3, 1:89, 4:5, 3:0}
>>> dict(sorted(d.items()))
{1: 89, 2: 3, 3: 0, 4: 5}
3
задан PoGibas 13 July 2018 в 19:51
поделиться

5 ответов

Решение с использованием data.table. Найти максимальное значение в столбцах 3:5 (столбцы оценки) с помощью ID и Group.

library(data.table)
setDT(d)
d[, .(Max = do.call(max, .SD)), .SDcols = 3:5, .(ID, Group)]

   ID Group Max
1: a1   abc  11
2: a1   def   5
3: a2   def  11

Данные:

d <- structure(list(ID = structure(c(1L, 1L, 1L, 2L), .Label = c("a1", 
"a2"), class = "factor"), Group = structure(c(1L, 1L, 2L, 2L), .Label = 
c("abc", 
"def"), class = "factor"), Score1 = c(10L, 0L, 0L, 5L), Score2 = c(0L, 
0L, 5L, 10L), Score3 = c(0L, 11L, 2L, 11L)), class = "data.frame", row.names = 
c(NA, 
-4L))
3
ответ дан PoGibas 17 August 2018 в 12:11
поделиться
  • 1
    Или аналогичный ответ @ www, есть melt(DT, meas=patterns("Score"))[, .(Max = max(value)), by=.(ID, Group)] – Frank 13 July 2018 в 19:57
  • 2
    Это работает очень быстро и правильно в моем более крупном файле данных. Я не знал о необходимости do.call с data.table. – user3594490 13 July 2018 в 19:59

Вот несколько других опций с tidyverse

library(tidyverse)
df1 %>%
     group_by(ID, Group) %>% 
     nest %>% 
     mutate(Max = map_dbl(data, ~ max(unlist(.x)))) %>% 
     select(-data)

Или с помощью pmax

df1 %>% 
    mutate(Max = pmax(!!! rlang::syms(names(.)[3:5]))) %>% 
    group_by(ID, Group) %>% 
    summarise(Max = max(Max))
# A tibble: 3 x 3
# Groups:   ID [?]
#  ID    Group   Max
#  <fct> <fct> <dbl>
#1 a1    abc      11
#2 a1    def       5
#3 a2    def      11

Или с помощью base R

aggregate(cbind(Max = do.call(pmax, df1[3:5])) ~ ID + Group, df1, max)
1
ответ дан akrun 17 August 2018 в 12:11
поделиться

Вот базовое R-решение

# gives 2x2 table
x <- by(df[, !names(df) %in% c("ID", "Group")], list(df$ID, df$Group), max)

# get requested format
tmp <- expand.grid(ID = rownames(x), Group = colnames(x))
tmp$Max <- as.vector(x)
tmp[complete.cases(tmp), ]
#R   ID Group Max
#R 1 a1   abc  11
#R 3 a1   def   5
#R 4 a2   def  11

с

df <- structure(list(
  ID = structure(c(1L, 1L, 1L, 2L), .Label = c("a1", "a2"), class = "factor"), 
  Group = structure(c(1L, 1L, 2L, 2L), .Label = c("abc", "def"), class = "factor"), 
  Score1 = c(10L, 0L, 0L, 5L), Score2 = c(0L, 0L, 5L, 10L), 
  Score3 = c(0L, 11L, 2L, 11L)), 
  class = "data.frame", row.names = c(NA, -4L))
0
ответ дан Benjamin Christoffersen 17 August 2018 в 12:11
поделиться

Вот решение tidyverse с использованием nest:

library(tidyverse)
df %>%
  nest(-(1:2),.key="Max") %>%
  mutate_at("Max",map_dbl, max)
#   ID Group Max
# 1 a1   abc  11
# 2 a1   def   5
# 3 a2   def  11

В базе R:

res <- aggregate(. ~ ID + Group,df,max)
res <- cbind(res[1:2], Max = do.call(pmax,res[-(1:2)]))
res
#   ID Group Max
# 1 a1   abc  11
# 2 a1   def   5
# 3 a2   def  11
0
ответ дан Moody_Mudskipper 17 August 2018 в 12:11
поделиться

Решение с использованием tidyverse.

library(tidyverse)

dat2 <- dat1 %>%
  gather(Column, Value, starts_with("Score")) %>%
  group_by(ID, Group) %>%
  summarise(Max = max(Value)) %>%
  ungroup()
dat2
# # A tibble: 3 x 3
#   ID    Group   Max
#   <fct> <fct> <dbl>
# 1 a1    abc      11
# 2 a1    def       5
# 3 a2    def      11
3
ответ дан www 17 August 2018 в 12:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: