2016-01-24 16 views
7

Mam dużą ramkę danych (1616610 wierszy, 255 kolumn) i muszę wkleić unikalne wartości każdej kolumny na podstawie klucza.Agregacja wszystkich unikatowych wartości każdej kolumny ramki danych

Na przykład:

> data = data.frame(a=c(1,1,1,2,2,3), 
       b=c("apples", "oranges", "apples", "apples", "apples", "grapefruit"), 
       c=c(12, 22, 22, 45, 67, 28), 
       d=c("Monday", "Monday", "Monday", "Tuesday", "Wednesday", "Tuesday")) 
> data 
    a   b c   d 
1 1  apples 12 Monday 
2 1 oranges 22 Monday 
3 1  apples 22 Monday 
4 2  apples 45 Tuesday 
5 2  apples 67 Wednesday 
6 3 grapefruit 28 Tuesday 

Co potrzebne jest do agregowania każdą unikalną wartość w każdej z 255 kolumn, i powrócić nową ramkę danych z separatorami przecinkami dla każdej unikatowej wartości. Tak:

a    b  c     d 
1 1 apples, oranges 12, 22    Monday 
2 2   apples 45, 67 Tuesday, Wednesday 
3 3  grapefruit  28   Thursday 

Próbowałem, używając aggregate, tak:

output <- aggregate(data, by=list(data$a), paste, collapse=", ") 

ale na ramce danych tej wielkości, to było zbyt czasochłonne (godziny), a często razy mam aby zabić proces razem. Oprócz tego będzie agregować wszystkie wartości, a nie tylko te niepowtarzalne. Czy ktoś ma jakieś wskazówki na temat:

1) jak poprawić czas tej agregacji dla dużych zbiorów danych

2), a następnie dostać unikalne wartości każdego pola

BTW, to jest mój pierwszy post na SO, więc dziękuję za cierpliwość.

+0

dla tej wielkości, jesteś prawdopodobnie będzie potrzebował 'dane .tabela ". Nie jestem świetny ze składni, ale są tu ludzie, którzy są. – alistaire

+0

dzięki @alistaire. Słyszałem dobre rzeczy o 'data.table' dla dużych zestawów danych i próbowałem z nim pracować, ale nie potrafię wymyślić składni tego problemu. – bab2155

+0

Dzięki @ G.Grothendieck! To zadziałało dobrze – bab2155

Odpowiedz

6

Przeniesiony z opinii:

library(data.table) 

dt <- as.data.table(data) 
dt[, lapply(.SD, function(x) toString(unique(x))), by = a] 

podaniem:

a    b  c     d 
1: 1 apples, oranges 12, 22    Monday 
2: 2   apples 45, 67 Tuesday, Wednesday 
3: 3  grapefruit  28   Tuesday 
+0

dzięki @G. Grothendieck. Pracował świetnie. – bab2155

2

Można wykonać następujące czynności z dplyr

func_paste <- function(x) paste(unique(x), collapse = ', ') 
data %>% 
    group_by(a) %>% 
    summarise_each(funs(func_paste)) 

##  a    b  c     d 
## (dbl)   (chr) (chr)    (chr) 
##1  1 apples, oranges 12, 22    Monday 
##2  2   apples 45, 67 Tuesday, Wednesday 
##3  3  grapefruit  28   Tuesday 
+0

W jednym, 'data%>% group_by (a)%>% summary_each (funs (wklej (unique (.), Collapse = ',')))). Jest wolniejszy od oryginalnego 'agregatu', chociaż zwraca przynajmniej poprawny wynik. – alistaire

+0

@alistaire Dzięki za testowanie i usunięcie potrzeby posiadania oddzielnej funkcji. Trudno byłoby pokonać rozwiązanie "data.table" dla prędkości biegu. – steveb