Mam ramkę danych R zawierającą czynnik, który chcę „rozszerzyć”, tak aby dla każdego poziomu czynnika była powiązana kolumna w nowej ramce danych, która zawiera wskaźnik 1/0. Np. Załóżmy, że mam:
df.original <-data.frame(eggs = c("foo", "foo", "bar", "bar"), ham = c(1,2,3,4))
Chcę:
df.desired <- data.frame(foo = c(1,1,0,0), bar=c(0,0,1,1), ham=c(1,2,3,4))
Ponieważ w przypadku niektórych analiz, do których trzeba mieć całkowicie numeryczną ramkę danych (np. Analiza głównych składowych), pomyślałem, że ta funkcja może być wbudowana. Napisanie funkcji, która to zrobi, nie powinno być zbyt trudne, ale mogę przewidzieć kilka wyzwania związane z nazwami kolumn i jeśli coś już istnieje, wolałbym tego użyć.
cast
dla mnie.?formula
, jak również?model.matrix
, ale nie było jasne (może być tylko mój brak dogłębnej wiedzy w algebrze macierzy i modelowego preparatu). Po dokładniejszym przeszukaniu, udało mi się ustalić, że -1 oznacza po prostu nie uwzględnianie kolumny „przecięcie”. Jeśli pominiesz -1, zobaczysz na wyjściu kolumnę przecięcia z 1 z jedną kolumną binarną pominiętą. Możesz zobaczyć, które wartości pominiętej kolumny są 1 na podstawie wierszy, w których wartości innych kolumn są równe 0. Dokumentacja wydaje się tajemnicza - czy jest inny dobry zasób?model.matrix(~., data=iris)[,-1]
naresid
aby ponownie wstawić brakujące wartości po użyciuna.exclude
. Szybki przykład:tmp <- data.frame(x=factor(c('a','b','c',NA,'a'))); tmp2 <- na.exclude(tmp); tmp3 <- model.matrix( ~x-1, tmp2); tmp4 <- naresid(attr(tmp2,'na.action'), tmp3)
Jeśli twoja ramka danych składa się tylko z czynników (lub pracujesz nad podzbiorem zmiennych, które są wszystkimi czynnikami), możesz również użyć
acm.disjonctif
funkcji zade4
pakietu:Nie jest to dokładnie ten przypadek, który opisujesz, ale może być też przydatny ...
źródło
Szybki sposób korzystania z
reshape2
pakietu:Zauważ, że daje to dokładnie takie nazwy kolumn, jakie chcesz.
źródło
ham
to unikalny identyfikator wiersza. Jeśliham
nie jest unikalnym identyfikatorem, należy użyć innego unikalnego identyfikatora (lub utworzyć fikcyjny) i użyć go zamiastham
. Przekształcenie etykiety kategorialnej na wskaźnik binarny miałoby sens tylko w przypadku unikalnych identyfikatorów.prawdopodobnie zmienna zastępcza jest podobna do tego, czego chcesz. Wtedy przydaje się model.matrix:
źródło
Późne wejście
class.ind
znnet
paczkiźródło
Właśnie natknąłem się na ten stary wątek i pomyślałem, że dodam funkcję, która wykorzystuje ade4 do pobrania ramki danych składającej się z czynników i / lub danych liczbowych i zwraca ramkę danych z czynnikami jako fałszywymi kodami.
Spróbujmy.
źródło
Oto bardziej przejrzysty sposób, aby to zrobić. Używam model.matrix do tworzenia fikcyjnych zmiennych boolowskich, a następnie łączę je z powrotem z oryginalną ramką danych.
źródło
Potrzebowałem funkcji do „eksplodowania” czynników, która jest nieco bardziej elastyczna, i utworzyłem ją na podstawie funkcji acm.disjonctif z pakietu ade4. Pozwala to na wybranie rozstrzelonych wartości, które są równe 0 i 1 w acm.disjonctif. Rozbija tylko czynniki, które mają „kilka” poziomów. Kolumny numeryczne są zachowane.
źródło