为什么 is.factor() 在 apply() 和 sapply() 中使用 returns 不同的值?
Why is.factor() used in apply() and sapply() returns different values?
我的objective是得到一个布尔值的向量来表示data.frame中的每一列是否是一个因子,我在sapply()
中使用了is.factor()
和 apply()
函数,看起来它们 return 不同的值,并且 apply()
return 是错误的值。谁能告诉我是什么导致了这种差异?
X <- data.frame(X1=c(1,2,3,4), ## numeric
X2=factor(paste0("f",c(1:4))) ## factor)
sapply(X, is.factor)
## FALSE TRUE
apply(X, 2, is.factor)
## FALSE FALSE // apparently this is wrong, the second value is supposed to be TRUE.
其他函数也发生了同样的事情,例如 class()
、is.numeric()
。
来自apply
的参考:
Returns a vector or array or list of values obtained by applying a
function to margins of an array or matrix.
因此,它首先将您的输入对象转换为矩阵(数组),该矩阵(数组)必须具有相同的原子数据类型。这意味着您的数据被强制转换为 character
,因为 factor
不是原子向量类型。
> as.matrix(X)
X1 X2
[1,] "1" "f1"
[2,] "2" "f2"
[3,] "3" "f3"
[4,] "4" "f4"
我的objective是得到一个布尔值的向量来表示data.frame中的每一列是否是一个因子,我在sapply()
中使用了is.factor()
和 apply()
函数,看起来它们 return 不同的值,并且 apply()
return 是错误的值。谁能告诉我是什么导致了这种差异?
X <- data.frame(X1=c(1,2,3,4), ## numeric
X2=factor(paste0("f",c(1:4))) ## factor)
sapply(X, is.factor)
## FALSE TRUE
apply(X, 2, is.factor)
## FALSE FALSE // apparently this is wrong, the second value is supposed to be TRUE.
其他函数也发生了同样的事情,例如 class()
、is.numeric()
。
来自apply
的参考:
Returns a vector or array or list of values obtained by applying a function to margins of an array or matrix.
因此,它首先将您的输入对象转换为矩阵(数组),该矩阵(数组)必须具有相同的原子数据类型。这意味着您的数据被强制转换为 character
,因为 factor
不是原子向量类型。
> as.matrix(X)
X1 X2
[1,] "1" "f1"
[2,] "2" "f2"
[3,] "3" "f3"
[4,] "4" "f4"