在某种程度上,问题在于apply
,但更恰当地说,问题在于as.matrix
,以及它如何处理logical
值。
以下是一些示例,可帮助详细说明我对 Karl 的查询。
首先,让我们创建四个data.frame
s 来做一些测试。
- 您的原始
data.frame
演示行为:
- A
data.frame
在“测试”列中包含不同数量的字符,以查看 Karl 对正在发生的事情的解释。
- A
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
,但“测试”列不受影响。唔。
as.matrix(df2)
# test logi
# [1,] "aa" " TRUE"
# [2,] "b" "FALSE"
# [3,] "<" "FALSE"
# [4,] ">>" " TRUE"
啊...这在较短的数字之前有一个空格TRUE
和空格。因此,似乎 R 正在考虑 and 的数字基础值TRUE
,但计算andFALSE
中字符数的宽度。同样,第一个“测试”列不受影响。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 公共聊天室中,Joshua Ulrich 指出自己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"