Как агрегировать данные в R таким образом, чтобы получить всю строку, которая удовлетворяет условию агрегации? [нет dplyr] - PullRequest
0 голосов
/ 28 января 2020

У меня есть данные, которые выглядят следующим образом:

ID  FACTOR_VAR  INT_VAR
1     CAT          1
1     DOG          0

Я хочу агрегировать по ID так, чтобы результирующий кадр данных содержал строку whole , которая удовлетворяет моему условию агрегирования. Поэтому, если я агрегирую по max из INT_VAR, я хочу вернуть всю первую строку:

ID  FACTOR_VAR  INT_VAR
1     CAT          1

Следующее не будет работать, потому что FACTOR_VAR является фактором:

new_data <- aggregate(data[,c("ID", "FACTOR_VAR", "INT_VAR")], by=list(data$ID), fun=max)

Как я могу это сделать? Я знаю, что в dplyr есть группа по функциям, но, к сожалению, я работаю на компьютере, для которого загрузка пакетов занимает много времени. Поэтому я ищу способ сделать это только с ванильным R.

Ответы [ 3 ]

1 голос
/ 28 января 2020

Вы можете использовать aggregate для этого. Если вы хотите сохранить все столбцы, с ним можно использовать merge.

merge(aggregate(INT_VAR ~ ID, data = df, max), df, all.x = T)

 #   ID INT_VAR FACTOR_VAR
 #1  1       1        CAT

data

df <- structure(list(ID = c(1L, 1L), FACTOR_VAR = structure(1:2, .Label = c("CAT", "DOG"), class = "factor"), INT_VAR = 1:0), class = "data.frame", row.names = c(NA,-2L))
0 голосов
/ 28 января 2020

Мы можем сделать это в dplyr

library(dplyr)
df %>%
  group_by(ID)
  filter(INT_VAR == max(INT_VAR))

Или используя data.table

library(data.table)
setDT(df)[, .SD[INT_VAR == max(INT_VAR)], by = ID]
0 голосов
/ 28 января 2020

Если вы хотите сохранить все столбцы, используйте ave вместо:

subset(df, as.logical(ave(INT_VAR, ID, FUN = function(x) x == max(x))))
...