2014-10-08 3 views
2

Интересно, почему функция as.factor не работает при применении через apply Функция в R?Почему `as.factor` не работает при применении с помощью функции` apply` в R?

> df.nrow <- 10 
> df <- data.frame(col1=sample(c("a","b","c"), df.nrow, TRUE), 
+     col2=sample(c("d","e","f"), df.nrow, TRUE), 
+     col3=sample(c("g","h","i"), df.nrow, TRUE)) 
> apply(df, 2, is.factor) 
col1 col2 col3 
FALSE FALSE FALSE 
> df <- apply(df, 2, as.factor) 
> apply(df, 2, is.factor) 
col1 col2 col3 
FALSE FALSE FALSE 
+0

@isomorphismes - прекратите добавлять теги, если вы не добавили описание тега в [as.factor]. Сейчас это ничего не значит и никому не помогает. –

+0

@RichardScriven Я добавил один уже. Тем не менее, он может быть не одобрен. – isomorphismes

+0

@isomorphismes Не добавлять теги для произвольных функций. Таким образом, безумие. Если вопрос имеет значение _fundamentally_ о факторах, вы можете подумать о добавлении уже существующего тега r-фактора. – joran

ответ

5

Я думаю, что это из-за того, как apply упрощает результат возвращает матрицу. От ?apply:

If ‘X’ is not an array but an object of a class with a non-null 
    ‘dim’ value (such as a data frame), ‘apply’ attempts to coerce it 
    to an array via ‘as.matrix’ if it is two-dimensional (e.g., a data 
    frame) or via ‘as.array’. 

На самом деле исходный кадр данных, как вы хотите. Попробуйте str(df) или sapply(df, is.factor), чтобы проверить его. В основном символьные векторы всегда привязаны к факторам, если только stringsAsFactors=FALSE.

+0

Я боюсь, что он не работает (просто проверил). –

+1

Если ваш способ проверки факторов, которые не работают. Вы можете использовать 'sapply (df, is.factor)' – konvas

+0

Черт, вы правы! :) Я действительно извиняюсь за то, что я небрежен! –