2010-03-08 9 views
12

Mam ramkę danych, w której jedna konkretna kolumna ma zestaw określonych wartości (powiedzmy 1, 2, ..., 23). Chciałbym przekonwertować z tego układu na ten, w którym ramka miałaby dodatkowe 23 (w tym przypadku) kolumny, z których każda reprezentuje jedną z wartości współczynnika. Dane w tych kolumnach byłyby wartości logiczne wskazujące, czy dany wiersz miał daną wartość współczynnika ... Aby wyświetlić konkretny przykład: RamaPrzekształć ramkę danych, aby przekonwertować współczynniki na kolumny w R

Źródło:

ID  DATE   SECTOR 
123  2008-01-01 1 
456  2008-01-01 3 
789  2008-01-02 5 
... <more records with SECTOR values from 1 to 5> 

żądany format:

ID  DATE   SECTOR.1 SECTOR.2 SECTOR.3 SECTOR.4 SECTOR.5 
123  2008-01-01  T   F   F   F   F 
456  2008-01-01  F   F   T   F   F 
789  2008-01-02  F   F   F   F   T 

Nie mam problemu z robieniem tego w pętli, ale miałem nadzieję, że będzie lepszy sposób. Do tej pory reshape() nie przyniosło pożądanego rezultatu. Pomoc będzie bardzo mile widziane.

Odpowiedz

14

Chciałbym spróbować powiązać kolejną kolumnę o nazwie "wartość" i ustawić value = TRUE.

df <- data.frame(cbind(1:10, 2:11, 1:3)) 
colnames(df) <- c("ID","DATE","SECTOR") 
df <- data.frame(df, value=TRUE) 

Następnie wykonaj Reshape:

reshape(df, idvar=c("ID","DATE"), timevar="SECTOR", direction="wide") 

Problem z użyciem funkcji reshape jest to ustawienie domyślne dla brakujących wartości jest NA (w tym przypadku trzeba będzie iteracyjne i zastąpić je FAŁSZ) .

W przeciwnym wypadku można użyć cast z opakowania reshape (see this question for an example) i ustawić domyślną do FALSE.

df.wide <- cast(df, ID + DATE ~ SECTOR, fill=FALSE) 
> df.wide 
    ID DATE  1  2  3 
1 1 2 TRUE FALSE FALSE 
2 2 3 FALSE TRUE FALSE 
3 3 4 FALSE FALSE TRUE 
4 4 5 TRUE FALSE FALSE 
5 5 6 FALSE TRUE FALSE 
6 6 7 FALSE FALSE TRUE 
7 7 8 TRUE FALSE FALSE 
8 8 9 FALSE TRUE FALSE 
9 9 10 FALSE FALSE TRUE 
10 10 11 TRUE FALSE FALSE 
+2

Dziękuję. Powinienem był pomyśleć o stworzeniu kolumny wartości. Co ciekawe, podejście kolumna wartości/zmiana kształtu zajmuje 1,4 sekundy na 9,500 wierszy z 26 poziomami czynnika, podczas gdy użycie podejścia iteracyjnego (ponad poziomami) zajmuje tylko 0,6 sekundy. –

+3

Nie daj się zwieść tym funkcjom: funkcja 'reshape' sama wykonuje iterację, jeśli na nią spojrzysz. Ale poza tym ma jeszcze wiele innych zalet, które zwiększą ogólny czas. Rzeczy takie jak "przekształcić" nie mają na celu lepszej wydajności; są tam tylko po to, aby ułatwić manipulację danymi. – Shane

2

Oto kolejny podejście używając xtabs, które mogą lub nie mogą być szybsze (jeśli ktoś próbowałby i daj mi znać):

df <- data.frame(cbind(1:12, 2:13, 1:3)) 
colnames(df) <- c("ID","DATE","SECTOR") 
foo <- xtabs(~ paste(ID, DATE) + SECTOR, df) 
cbind(t(matrix(as.numeric(unlist(strsplit(rownames(foo), " "))), nrow=2)), foo) 
Powiązane problemy