2012-12-16 15 views
12

Chciałbym przekształcić moją ramkę danych w macierz, która rozwija kolumnę o jednym współczynniku w wiele i przypisuje 1/0 w zależności od czynnika. Na przykładPrzekształcanie współczynników R w binarne wartości macierzy

C1 C2 C3 
A 3 5 
B 3 4 
A 1 1 

powinien przekształcić się w coś podobnego

C1_A C1_B C2 C3 
1  0 3 5 
0  1 3 4 
1  0 1 1 

Jak mogę to zrobić w R? Próbowałem data.matrix, as.matrix, który nie zwrócił mi tego, co chciałem. Przypisują wartość "całkowitą" do pojedynczej kolumny czynnikowej, nie ma rozszerzenia.

Odpowiedz

15

Zakładając dat to ramka danych:

cbind(dat, model.matrix(~ 0 + C1, dat)) 

    C1 C2 C3 C1A C1B 
1 A 3 5 1 0 
2 B 3 4 0 1 
3 A 1 1 1 0 

Rozwiązanie współpracuje z dowolnej liczby poziomów czynnika i bez ręcznego określania nazwy kolumn.

Jeśli chcesz wykluczyć kolumnę C1, można użyć polecenia:

cbind(dat[-1], model.matrix(~ 0 + C1, dat)) 
+10

OP wydaje się chcieć 'model.matrix (~. + 0, dat)'. – Roland

+0

@Roland Dobry pomysł +1. To byłoby jeszcze łatwiejsze. –

+1

@Sven, to działało, dziękuję. Nadal utrzymuje wynik C1 (oprócz C1_A, kolumny C1_B), jakikolwiek pomysł, jak usunąć oryginalną kolumnę? Jest to jednak pytanie bardziej ogólne (być może), po prostu prosty sposób na powiedzenie "daj mi wszystkie kolumny poza tym, że" jeden zrobiłby. – user423805

2

Nazwijmy Twój data.frame df:

library(reshape2) 
dcast(df,C2*C3~C1,fill=0,length) 

    C2 C3 A B 
1 1 1 1 0 
2 3 4 0 1 
3 3 5 1 0 
+1

Dzięki za obie odpowiedzi .. isnt istnieje sposób, aby to zrobić konwersję bez określenia nazwy kolumn, takie jak C1? Po prostu .. convert (df) i będzie obsługiwać czynniki. lm() jak również inne metody regresji czy to wewnętrznie prawo? – user423805

3
dat <- read.table(text =' C1 C2 C3 
A 3 5 
B 3 4 
A 1 1',header=T) 

Korzystanie przekształcić

transform(dat,C1_A =ifelse(C1=='A',1,0),C1_B =ifelse(C1=='B',1,0))[,-1] 
    C2 C3 C1_A C1_B 
1 3 5 1 0 
2 3 4 0 1 
3 1 1 1 0 

lub uzyskać więcej flexbility z within

within(dat,{ 
      C1_A =ifelse(C1=='A',1,0) 
      C1_B =ifelse(C1=='B',1,0)}) 

    C1 C2 C3 C1_B C1_A 
1 A 3 5 0 1 
2 B 3 4 1 0 
3 A 1 1 0 1 
Powiązane problemy