2013-10-03 5 views
6

Я пытаюсь разделить набор данных на части, которые имеют фактор-переменные и нефакторные переменные.R sapply is.factor

Я ищу, чтобы сделать что-то вроде:

Эта часть работы:

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

Эта часть не будет работать:

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

из-за этой ошибки:

Error in !is.factor : invalid argument type 

Есть ли ac правильно ли это сделать?

+1

[Соответствующий вопрос] (http://stackoverflow.com/questions/15593934/why-cant-qnorm-in-sapply/15594648#15594648). Хотя вопросы достаточно разные, чтобы не дублировать, рассуждения о том, что происходит on идентичен –

+0

Вам, вероятно, не нужно разделить ваш df на факторные и нефакторные столбцы, но для этого существует ... 'lapply (split (colnames (DF), factorCols), function (x) DF [, x, drop = FALSE]) 'отсюда: http://stackoverflow.com/a/15118036/1191259 – Frank

ответ

8

Правильный путь:

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

Большое спасибо! – screechOwl

8

Джошуа дал вам правильный способ сделать это. Что касается почемуsapply(df1, !is.factor) не получилось:

sapply ожидает функции. !is.factor не является функцией. Оператор bang возвращает логическое значение (хотя в качестве аргумента он не может принимать is.factor).

В качестве альтернативы вы можете использовать Negate(is.factor), который фактически возвращает функцию.

+1

Очень крутое решение с 'Negate'! Не знал этого. – cryo111

Смежные вопросы