В некотором смысле проблема связана с apply
, но, что более уместно, проблема с as.matrix
и тем, как он обрабатывает значения logical
.
Вот несколько примеров, которые помогут уточнить мой запрос к Карлу.
Во-первых, давайте создадим четыре data.frame
, чтобы провести несколько тестов.
- Ваш оригинальный
data.frame
для демонстрации поведения:
data.frame
с различным количеством символов в столбце «тест», чтобы изучить объяснение Карла того, что происходит.
data.frame
с некоторыми числами, чтобы помочь нам понять, что на самом деле происходит.
data.frame
, где явно создается столбец "logi" as.character
.
df1 <- data.frame(test = c("a","b","<",">"),
logi = c(TRUE,FALSE,FALSE,TRUE))
df2 <- data.frame(test = c("aa","b","<",">>"),
logi = c(TRUE,FALSE,FALSE,TRUE))
df3 <- data.frame(test = c("aa","b","<",">>"),
logi = c(TRUE,FALSE,FALSE,TRUE),
num = c(1, 12, 123, 2))
df4 <- data.frame(test = c("aa","b","<",">>"),
logi = as.character(c(TRUE,FALSE,FALSE,TRUE)))
Теперь давайте используем as.matrix
для каждого из них.
Перед TRUE
стоит пробел.
as.matrix(df1)
# test logi
# [1,] "a" " TRUE"
# [2,] "b" "FALSE"
# [3,] "<" "FALSE"
# [4,] ">" " TRUE"
Перед TRUE
есть пробел, но столбец «test» не изменяется. Хм.
as.matrix(df2)
# test logi
# [1,] "aa" " TRUE"
# [2,] "b" "FALSE"
# [3,] "<" "FALSE"
# [4,] ">>" " TRUE"
Ах ... Здесь пробел перед TRUE
и пробелом перед более короткими числами. Таким образом, кажется, что, возможно, R рассматривает числовое базовое значение TRUE
и FALSE
, но вычисляет ширину количества символов в TRUE
и FALSE
. Опять же, первый «тестовый» столбец остается неизменным.
as.matrix(df3)
# test logi num
# [1,] "aa" " TRUE" " 1"
# [2,] "b" "FALSE" " 12"
# [3,] "<" "FALSE" "123"
# [4,] ">>" " TRUE" " 2"
Здесь все будет хорошо, если вы скажете R, что столбец logi
является символьным.
as.matrix(df4)
# test logi
# [1,] "aa" "TRUE"
# [2,] "b" "FALSE"
# [3,] "<" "FALSE"
# [4,] ">>" "TRUE"
Как бы то ни было, у sapply
, похоже, нет этой проблемы.
sapply(df1, as.matrix)
# test logi
# [1,] "a" "TRUE"
# [2,] "b" "FALSE"
# [3,] "<" "FALSE"
# [4,] ">" "TRUE"
Обновлять
В чате R Public Джошуа Ульрих указывает на format
виновника. as.matrix
использует as.vector
для факторов, которые преобразуют их в символы (попробуйте str(as.vector(df1$test))
, чтобы понять, что я имею в виду; для всего остального используется format
, но, к сожалению, у него нет возможности включить какие-либо аргументы из format
, один из которых trim
(который по умолчанию установлен на FALSE
).
Сравните следующее:
A <- c(TRUE, FALSE)
format(A)
# [1] " TRUE" "FALSE"
format(A, trim = TRUE)
# [1] "TRUE" "FALSE"
format(as.character(A))
# [1] "TRUE " "FALSE"
format(as.factor(A))
# [1] "TRUE " "FALSE"
Итак, как легко преобразовать логические столбцы в символы? Может быть, что-то вроде этого (хотя я бы предложил сначала создать резервную копию ваших данных):
df1[sapply(df1, is.logical)] <- lapply(df1[sapply(df1, is.logical)], as.character)
df1
# test logi
# 1 a TRUE
# 2 b FALSE
# 3 < FALSE
# 4 > TRUE
as.matrix(df1)
# test logi
# [1,] "a" "TRUE"
# [2,] "b" "FALSE"
# [3,] "<" "FALSE"
# [4,] ">" "TRUE"
04.09.2013