2013-10-03 6 views
6

Sto provando a separare un set di dati in parti che hanno variabili fattore e variabili non fattore.R sapply is.factor

sto cercando di fare qualcosa di simile:

Questa parte funziona:

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

Questa parte non funzionerà:

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

a causa di questo errore:

Error in !is.factor : invalid argument type 

È ci ca orretti il ​​modo di fare questo?

+1

[Domanda pertinente] (http://stackoverflow.com/questions/15593934/why-cant-qnorm-in-sapply/15594648#15594648) Mentre le domande sono abbastanza diverse da non essere duplicati, il ragionamento dietro ciò che sta succedendo on è identico –

+0

Probabilmente non hai bisogno di dividere il tuo df in colonne factor e non factor, ma per farlo, c'è ... 'lapply (split (colnames (DF), factorCols), function (x) DF [, x, drop = FALSE]) 'da qui: http://stackoverflow.com/a/15118036/1191259 – Frank

risposta

8

modo corretto:

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

Grazie mille! – screechOwl

8

Joshua ti ha dato il modo corretto per farlo. Per quanto riguarda il motivo per cui sapply(df1, !is.factor) non ha funzionato:

sapply si aspetta una funzione. !is.factor non è una funzione. L'operatore bang restituisce un valore logico (anche se non può assumere is.factor come argomento).

In alternativa, è possibile utilizzare Negate(is.factor) che di fatto restituisce una funzione.

+1

Soluzione molto interessante con 'Negate'! Non lo sapevo. – cryo111