2015-04-22 3 views
2

Я не смог найти ответ на свой вопрос, используя функцию поиска здесь и не в Google.Совокупность R на большом количестве столбцов без указания имен столбцов

У меня есть кадр данных (ширина 500 колонок, длина 200 000 строк) с несколькими рядами на человека. Каждая ячейка (кроме первого столбца с идентификатором человека) содержит 0 или 1. Я ищу способ уменьшить этот фрейм данных до 1 строки на человека, в котором я беру максимум для каждого столбца по отдельности.

Я знаю, что я мог бы использовать ddply или data.table ... как ниже ...

tt <-data.frame(person=c(1,1,1,2,2,2,3,3,3), col1=c(0,0,1,1,1,0,0,0,0),col2=c(1, 1, 0, 0, 0, 0, 1 ,0 ,1)) 

library(plyr) 
ddply(tt, .(person), summarize, col1=max(col1), col2=max(col2)) 

    person col1 col2 
     1 1 1 
     2 1 0 
     3 0 1 

Но я не хочу, чтобы указать каждый из моих имен столбцов, потому что 1) У меня есть 500 и 2) в новом наборе данных они могут быть разными.

ответ

5

Используйте функцию summarise_each из dplyr

library(dplyr) 
tt %>% group_by(person) %>% summarise_each(funs(max)) 

# person col1 col2 
# 1  1 1 1 
# 2  2 1 0 
# 3  3 0 1 

или только базовой aggregate функции

aggregate(.~person, tt, max) 

# person col1 col2 
# 1  1 1 1 
# 2  2 1 0 
# 3  3 0 1 
+0

Спасибо! Работает и достаточно быстро! – Luc

0

Ниже еще один судебный процесс только с помощью l(s)apply().

t(sapply(unique(tt$person), function(x) lapply(tt[tt$person==x,], max))) 
    person col1 col2 
[1,] 1  1 1 
[2,] 2  1 0 
[3,] 3  0 1 
3

Или используйте data.table.

library(data.table) 
setDT(tt)[, lapply(.SD, max), person] 
# person col1 col2 
#1:  1 1 1 
#2:  2 1 0 
#3:  3 0 1 
Смежные вопросы