我正在尝试将基本矩阵从一种类型转换为另一种类型。这似乎是一个非常基本的问题,但令人惊讶的是我没有看到答案。
这是一个简单的例子:
> btest <- matrix(LETTERS[1:9], ncol = 3)
> ctest <- apply(btest, 2, as.factor)
> class(ctest[1,1])
[1] "character"
我在堆栈溢出中找到的唯一例子是data.frame列,这看起来更简单......
dtest <- as.data.frame(btest, stringsAsFactors = F)
dtest[] <- lapply(dtest[colnames(dtest)], as.factor)
dtest
V1 V2 V3
1 A D G
2 B E H
3 C F I
class(dtest[1,1])
[1] "factor"
是否有直接的方法将矩阵从字符更改为因子并指定级别?
答案 0 :(得分:1)
矩阵只保存一种数据类型。因子是由字符和整数类型组成的复杂数据类型。 Matrix一次不能容纳两种类型。列表是因子的适当数据结构。 Data.frame是一种列表数据结构。
矩阵?matrix
的帮助文档说明了
可选数据向量(包括列表或表达式 向量)。非原子级R对象由as.vector和all强制执行 属性丢弃。
因子的属性如下所示。
attributes(factor(letters[1:4]))
$levels
[1] "a" "b" "c" "d"
$class
[1] "factor"
在矩阵形成期间使用as.vector
删除这些属性。
attributes(as.vector(factor(letters[1:4])))
NULL
答案 1 :(得分:1)
在R中,矩阵主要只是一个dim
属性长度为2的向量(参见?matrix
)。它的类是matrix
,但它通常不作为属性存储,与基于列表的对象不同。
因此,您可以使用structure
:
btest <- matrix(LETTERS[1:9], ncol = 3)
btest_fac <- structure(factor(btest), dim = dim(btest), class = c('matrix', 'factor'))
btest_fac
#> [,1] [,2] [,3]
#> [1,] A D G
#> [2,] B E H
#> [3,] C F I
#> Levels: A B C D E F G H I
str(btest_fac)
#> matrix [1:3, 1:3] A B C D ...
#> - attr(*, "levels")= chr [1:9] "A" "B" "C" "D" ...
class(btest_fac)
#> [1] "matrix" "factor"
然而,虽然这是可能的,但它并不是非常有用,因为函数会不可预测地处理它,例如apply
会将其强制转换为整数。你可以为它定义自己的类和适当的方法,但这将是更多的工作。