factor()和factor()只将变量转换为字符而不是因子级别

factor()和factor()只将变量转换为字符而不是因子级别,r,R,假设我创建了这样的数据表: a = c(1,2,3,4,2,2,5,3,1) b = c(4,5,2,2,1,1,1,1,3) c = c(1,1,1,0,0,0,0,0,1) abc = rbind(a,b,c) abc = as.data.frame(t(abc)) str(abc) 'data.frame': 9 obs. of 3 variables: $ a: num 1 2 3 4 2 2 5 3 1 $ b: num 4 5 2 2 1 1 1 1 3 $ c:

假设我创建了这样的数据表:

a = c(1,2,3,4,2,2,5,3,1)
b = c(4,5,2,2,1,1,1,1,3)
c = c(1,1,1,0,0,0,0,0,1)
abc = rbind(a,b,c)
abc = as.data.frame(t(abc))
str(abc)
'data.frame':   9 obs. of  3 variables:
 $ a: num  1 2 3 4 2 2 5 3 1
 $ b: num  4 5 2 2 1 1 1 1 3
 $ c: num  1 1 1 0 0 0 0 0 1
最后一行将返回以下数据表:

a = c(1,2,3,4,2,2,5,3,1)
b = c(4,5,2,2,1,1,1,1,3)
c = c(1,1,1,0,0,0,0,0,1)
abc = rbind(a,b,c)
abc = as.data.frame(t(abc))
str(abc)
'data.frame':   9 obs. of  3 variables:
 $ a: num  1 2 3 4 2 2 5 3 1
 $ b: num  4 5 2 2 1 1 1 1 3
 $ c: num  1 1 1 0 0 0 0 0 1
我想将a列和b列转换为系数:

abc[,c("a","b")] = apply(abc[, c("a","b")], 2, factor)
但出于某种原因,它并没有转变为因素,而是转变为角色:

'data.frame':   9 obs. of  3 variables:
 $ a: chr  "1" "2" "3" "4" ...
 $ b: chr  "4" "5" "2" "2" ...
 $ c: num  1 1 1 0 0 0 0 0 1
但如果我单独做:

abc[,'c'] = as.factor(abc[,'c'])
它将在以下方面发挥作用:

> str(abc)
'data.frame':   9 obs. of  3 variables:
 $ a: chr  "1" "2" "3" "4" ...
 $ b: chr  "4" "5" "2" "2" ...
 $ c: Factor w/ 2 levels "0","1": 2 2 2 1 1 1 1 1 2
为什么会这样?为什么我不能将这些数字转换成因子???
感谢使用
lappy
而不是
apply
来避免矩阵强制。可以通过
class(abc[,1])
返回
“numeric”
,但是
class(abs[,1:2]
返回
data.frame
。作为data.frame(也)列表,
lappy(abc[,1:2],factor)
将在
apply(abs[,1:2],2,factor)
期望(并且实际上强制)矩阵(更一般地说是数组)的地方工作。
apply()
并不期望数组(这是其他输入的问题),但它返回一个矩阵——在应用程序的第一部分创建了这两个因子之后,它们在形成返回值时被强制为字符。您可以通过
unlist(apply(abc[,1:2],2,function(x)list(factor(x)),recursive=FALSE)说服自己(但使用
lappy()
。非常感谢大家!:)使用
lappy
而不是
apply
来避免矩阵强制。这可以通过
class(abc[,1])
返回
“数值”
但是
类(abs[,1:2]
返回
数据。frame
作为data.frame(也是)列表,
lappy(abc[,1:2],因子)
将在
apply(abs[,1:2],2,factor)
期望(并且实际上强制)矩阵(更一般地说是数组)的地方工作。
apply()
并不期望数组(这是其他输入的问题),但它返回一个矩阵——在应用程序的第一部分创建了这两个因子之后,它们在形成返回值时被强制为字符。您可以通过
unlist(apply(abc[,1:2],2,function(x)list(factor(x)),recursive=FALSE)说服自己(但使用
lappy()
。非常感谢大家!:)