R 意外转换为数据帧和矩阵中的字符而不是因子

R 意外转换为数据帧和矩阵中的字符而不是因子,r,dataframe,type-conversion,apply,r-factor,R,Dataframe,Type Conversion,Apply,R Factor,我不是R的新手,但下面是最令人困惑的 我有一个分类变量的数据框架(虽然这个问题同样存在于矩阵中),取值为+1/-1,我想将其转换为因子 mat <- matrix(sample(c(-1, +1), 16, replace = T), nrow = 4) mat <- data.frame(mat) 也许出于同样的原因(我的一些其他数据也有类似的问题),尝试将矩阵和数据帧中的字符名转换为因子会导致更混乱的行为: mat2 <- matrix(sample(letters,

我不是R的新手,但下面是最令人困惑的

我有一个分类变量的数据框架(虽然这个问题同样存在于矩阵中),取值为+1/-1,我想将其转换为因子

mat <- matrix(sample(c(-1, +1), 16, replace = T), nrow = 4)
mat <- data.frame(mat)
也许出于同样的原因(我的一些其他数据也有类似的问题),尝试将矩阵和数据帧中的字符名转换为因子会导致更混乱的行为:

 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" 
mat2 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]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”

任何帮助或澄清都将不胜感激。

请始终记住,数据帧是列表,因此对列进行操作就像对列表中的元素进行迭代一样。我想你可能打算做一些更像这样的事情:

mat[] <- lapply(mat,factor)

尽管如此,请注意,每个因素的水平并不相同

因此,如果您仔细阅读
?apply
,您会注意到它没有说返回的值将是数据帧。始终是向量或数组(即矩阵)。这些只能包含一种原子类型(不是因子)。事实上,直接引用一句话:“在所有情况下,在设置维度之前,as.vector将结果强制为一种基本向量类型,因此(例如)因子结果将强制为字符数组。”。好的,谢谢。我真的忽略了这一点!虽然,你建议的代码并不是我的本意,也不是我想要做的。抱歉,乔丹,你建议的实际上是我需要的!(将液位固定到正确的值是一个小问题)。吸取教训!
 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" 
mat[] <- lapply(mat,factor)
as.data.frame(lapply(mat,factor))