Неожиданное преобразование в символы вместо факторов во фреймах данных и матрицах

Я не новичок в R, но меня больше всего сбивает с толку следующее.

У меня есть кадр данных (хотя проблема в равной степени присутствует и для матриц) категориальных переменных, принимающих значения +1/-1, которые я хотел бы преобразовать в факторы.

mat <- matrix(sample(c(-1, +1), 16, replace = T), nrow = 4)
mat <- data.frame(mat)

Однако, используя

mat <- apply(mat, 2, factor)

превращает целые числа в символы вместо множителей:

> mat 
     [,1] [,2] [,3] [,4]
[1,] "-1" "1"  "-1" "1" 
[2,] "-1" "-1" "-1" "-1"
[3,] "-1" "1"  "1"  "1" 
[4,] "-1" "-1" "1"  "1" 

Возможно, в том же духе (и у меня была проблема такого рода с некоторыми другими моими данными), попытка преобразовать имена символов в матрицах и фреймах данных в факторы приводит к более запутанному поведению:

 mat2 <- matrix(sample(letters, 16, replace = T), nrow = 4)
 > mat2
     [,1] [,2] [,3] [,4]
 [1,] "x"  "m"  "r"  "e" 
 [2,] "u"  "r"  "b"  "p" 
 [3,] "j"  "p"  "h"  "j" 
 [4,] "k"  "s"  "e"  "x" 

mat2[,1] <- factor(mat2[,1])
> mat2
     [,1] [,2] [,3] [,4]
 [1,] "4"  "m"  "r"  "e" 
 [2,] "3"  "r"  "b"  "p" 
 [3,] "1"  "p"  "h"  "j" 
 [4,] "2"  "s"  "e"  "x" 

любая помощь или разъяснение будут оценены.


person stas g    schedule 07.06.2013    source источник
comment
Итак, если вы внимательно прочитаете ?apply, то заметите, что нигде не сказано, что возвращаемое значение будет фреймом данных. Всегда вектор или массив (т.е. матрица). И они могут содержать только один атомный тип (не факторы).   -  person joran    schedule 07.06.2013
comment
На самом деле, прямая цитата: во всех случаях as.vector приводит результат к одному из основных векторных типов до того, как будут установлены размеры, так что (например) результаты фактора будут приведены к массиву символов.   -  person joran    schedule 07.06.2013


Ответы (1)


Всегда помните, что фреймы данных — это списки, поэтому работа со столбцами аналогична перебору элементов списка. Я думаю, может быть, вы намеревались сделать что-то более похожее на это:

mat[] <- lapply(mat,factor)

или это:

as.data.frame(lapply(mat,factor))

Хотя и здесь учтите, что уровни каждого фактора неодинаковы!

person joran    schedule 07.06.2013
comment
Хорошо, спасибо, Джордан. я действительно упустил из виду это! хотя предложенный вами код - это не то, что я имел в виду или пытался сделать. - person stas g; 11.06.2013
comment
извините, Джордан, то, что вы предложили, на самом деле то, что мне нужно! (с исправлением уровней для правильных значений незначительная проблема). урок выучен! - person stas g; 12.06.2013