Как включить столбец идентификатора в совокупный результат (R) - PullRequest
0 голосов
/ 07 июня 2018

У меня есть фрейм данных, и я хотел бы получить минимальное значение столбцов A, B, C для каждой группы.

df <- data.frame(ID = seq(1,9,1),
                group = c(1,1,1,2,2,2,3,3,3),
                A = runif(9, min=0, max=10),
                B = runif(9, min=-10, max=10),
                C = runif(9, min=0, max=100))

require(reshape2)
df_melt <- melt(data = df, id.vars = c("ID", "group"))


dat_min <- aggregate(x = df_melt[, 4], 
                     by = list(group = df_melt$group, variable = df_melt$variable), 
                     FUN = min, 
                     na.rm=TRUE)

Я хотел бы получить столбецID присоединен к фрейму данных dat_min, поэтому результирующий фрейм данных:

group   variable          x         ID
1        A          0.4934011       3
2        A          4.3482557       6
3        A          1.6423930       7
1        B          6.1969513       2
...     ...         ...             ...

Возможно ли это в пределах aggregate?Как можно включить столбец идентификатора, не используя его в процессе группировки / агрегирования?

1 Ответ

0 голосов
/ 07 июня 2018

Я думаю, что это делает трюк, он использует фильтрацию, а не агрегирование, чтобы сохранить минимум:

library(dplyr)
library(tidyr)

df %>% 
  gather(var, val, A, B, C) %>%
  group_by(group, var) %>%
  arrange(group, val) %>%
  filter(row_number() == 1)

Если вы уверены, что никакое значение не повторится, это может сработать:

df %>% 
  gather(var, val, A, B, C) %>%
  group_by(group, var) %>%
  summarize(min_val = min(val),
            id = max(ID * (val == min(val))))

Создается заново для получения нескольких строк, если есть связи:

set.seed(1)
df <- data.frame(ID = seq(1,9,1),
                 group = c(1,1,1,2,2,2,3,3,3),
                 A = sample(1:5, 9, replace = TRUE),
                 B = sample(1:5, 9, replace = TRUE),
                 C = sample(1:5, 9, replace = TRUE))

df %>% 
  gather(var, val, A, B, C) %>%
  group_by(group, var) %>%
  filter(val == max(val)) 

Измените max(val) на min(val), если вы хотите, чтобы все строки имели минимальные значения.

...