2013-10-03 8 views
6

Próbuję oddzielić zbiór danych na części, które mają zmienne czynnikowe i zmienne nie będące czynnikami.R sapply is.factor

szukam zrobić coś takiego:

Ta część działa:

factorCols <- sapply(df1, is.factor) 
factorDf <- df1[,factorCols] 

Ta część nie będzie działać:

nonFactorCols <- sapply(df1, !is.factor) 

powodu tego błędu:

Error in !is.factor : invalid argument type 

Czy istnieje ac orrect sposób to zrobić?

+1

[Właściwe pytanie] (http://stackoverflow.com/questions/15593934/why-cant-qnorm-in-sapply/15594648#15594648) Podczas gdy pytania są na tyle różne, aby nie być duplikatami, uzasadnienie tego, co się dzieje on jest identyczny –

+0

Prawdopodobnie nie musisz dzielić twojego df na kolumny czynnikowe i niefaktoryzujące, ale aby to zrobić, istnieje ... 'lapply (split (nazwy kolumn (DF), factorCols), function (x) DF [, x, drop = FALSE]) 'from tutaj: http://stackoverflow.com/a/15118036/1191259 – Frank

Odpowiedz

8

Prawidłowy sposób:

nonFactorCols <- sapply(df1, function(col) !is.factor(col)) 
# or, more efficiently 
nonFactorCols <- !sapply(df1, is.factor) 
# or, even more efficiently 
nonFactorCols <- !factorCols 
+0

Dziękuję bardzo! – screechOwl

8

Joshua dał ci właściwą drogę, aby to zrobić. Jak dla dlaczegosapply(df1, !is.factor) nie działa:

sapply spodziewa funkcję. !is.factor nie jest funkcją. Operator bang zwraca wartość logiczną (aczkolwiek nie może przyjąć is.factor jako argumentu). Możliwe jest użycie Negate(is.factor), która w rzeczywistości zwraca funkcję.

+1

Bardzo fajne rozwiązanie z 'Negate'! Tego nie wiedziałem. – cryo111