Почему as.factor возвращает символ при использовании внутри приложения?

Я хочу преобразовать переменные в факторы, используя apply() :

 a <- data.frame(x1 = rnorm(100), x2 = sample(c("a","b"), 100, replace = T), x3 = factor(c(rep("a",50) , rep("b",50)))) a2 <- apply(a, 2,as.factor) apply(a2, 2,class) 

результаты:

  x1 x2 x3 "character" "character" "character" 

Я не понимаю, почему это приводит к символьным векторам вместо векторов факторов.

    apply преобразует ваш data.frame в матрицу символов. Используйте lapply :

     lapply(a, class) # $x1 # [1] "numeric" # $x2 # [1] "factor" # $x3 # [1] "factor" 

    Во второй команде применяется преобразование результата в матрицу символов, используя lapply :

     a2 <- lapply(a, as.factor) lapply(a2, class) # $x1 # [1] "factor" # $x2 # [1] "factor" # $x3 # [1] "factor" 

    Но для простого просмотра вы можете использовать str :

     str(a) # 'data.frame': 100 obs. of 3 variables: # $ x1: num -1.79 -1.091 1.307 1.142 -0.972 ... # $ x2: Factor w/ 2 levels "a","b": 2 1 1 1 2 1 1 1 1 2 ... # $ x3: Factor w/ 2 levels "a","b": 1 1 1 1 1 1 1 1 1 1 ... 

    Дополнительное объяснение в соответствии с комментариями:

    Почему во время подачи заявки не работает?

    Первое, что apply , - это преобразование аргумента в матрицу. Поэтому apply(a) эквивалентно apply(as.matrix(a)) . Как вы видите, str(as.matrix(a)) дает вам:

     chr [1:100, 1:3] " 0.075124364" "-1.608618269" "-1.487629526" ... - attr(*, "dimnames")=List of 2 ..$ : NULL ..$ : chr [1:3] "x1" "x2" "x3" 

    Больше нет факторов, поэтому class возвращает "character" для всех столбцов.
    lapply работает над столбцами, поэтому дает вам то, что вы хотите (для каждого столбца он делает что-то вроде class(a$column_name) ).

    Вы можете увидеть, как apply apply а as.factor не работает:

    Во всех случаях результат принуждается as.vector к одному из базовых векторных типов до того, как будут установлены размеры, так что (например) результат коэффициента будет принудительно применен к массиву символов.

    Почему sapply и as.factor не работают, вы можете видеть в помощи sapply :

    Значение (...) Атомный вектор или matrix или список той же длины, что и X (...) Если происходит упрощение, тип вывода определяется из наивысшего типа возвращаемых значений в иерархии NULL

    Вы никогда не получаете матрицу факторов или data.frame.

    Как преобразовать вывод в data.frame ?

    Простой, используйте as.data.frame как вы писали в комментарии:

     a2 <- as.data.frame(lapply(a, as.factor)) str(a2) 'data.frame': 100 obs. of 3 variables: $ x1: Factor w/ 100 levels "-2.49629293159922",..: 60 6 7 63 45 93 56 98 40 61 ... $ x2: Factor w/ 2 levels "a","b": 1 1 2 2 2 2 2 1 2 2 ... $ x3: Factor w/ 2 levels "a","b": 1 1 1 1 1 1 1 1 1 1 ... 

    Но если вы хотите заменить выбранные столбцы символов factor есть трюк:

     a3 <- data.frame(x1=letters, x2=LETTERS, x3=LETTERS, stringsAsFactors=FALSE) str(a3) 'data.frame': 26 obs. of 3 variables: $ x1: chr "a" "b" "c" "d" ... $ x2: chr "A" "B" "C" "D" ... $ x3: chr "A" "B" "C" "D" ... columns_to_change <- c("x1","x2") a3[, columns_to_change] <- lapply(a3[, columns_to_change], as.factor) str(a3) 'data.frame': 26 obs. of 3 variables: $ x1: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ... $ x2: Factor w/ 26 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10 ... $ x3: chr "A" "B" "C" "D" ... 

    Вы можете использовать его для замены всех столбцов, используя:

     a3 <- data.frame(x1=letters, x2=LETTERS, x3=LETTERS, stringsAsFactors=FALSE) a3[, ] <- lapply(a3, as.factor) str(a3) 'data.frame': 26 obs. of 3 variables: $ x1: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ... $ x2: Factor w/ 26 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10 ... $ x3: Factor w/ 26 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10 ... 
    Interesting Posts

    Выбрать элемент по точному соответствию его содержимому

    Как я могу заставить Microsoft Word 2003 идти слева направо по умолчанию

    Пользовательский макет, который округляет углы его содержимого

    Перспективы всегда отправляются с одного и того же адреса

    Как создать живой компакт-диск с вашими собственными приложениями?

    Возможно ли безопасное автозапуск USB с помощью планировщика заданий в Windows 7?

    Создать экземпляр объекта без вызова конструктора?

    Thunderbird – не удалять локальные копии сообщений IMAP

    как мне искать объект по ObjectId в консоли?

    Навигация по Windows 8 с контроллером Xbox 360

    CORS: нельзя использовать подстановочный знак в Access-Control-Allow-Origin, когда флаг учетных данных верен

    Подписанные и неподписанные целые числа

    Как создать двудольную сеть в R с помощью igraph или tnet

    AirPort не может подключиться к существующим сетям после восстановления разрешений на диск

    Когда следует использовать mmap для доступа к файлу?

    Давайте будем гением компьютера.