Ответ 1
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
do - преобразовать аргумент в матрицу. Итак, 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
и as.factor
не работают, вы можете увидеть в справке apply
:
Во всех случаях результат принуждается as.vector к одному из основного вектора перед установкой размеров, так что (например) результаты фактора будет принудительно применено к массиву символов.
Почему sapply
и as.factor
не работают, вы можете помочь с помощью sapply
:
Значение (...) Атомный вектор или матрица или список той же длины, что и X (...) Если происходит упрощение, вывод тип определяется от наивысшего тип возвращаемых значений в иерархия NULL < сырой < логическое < целое число < real < комплекс < символ < список < выражения, после принуждения парные списки в списки.
Вы никогда не получаете матрицу факторов или 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 ...