将矩阵从字符转换为因子

时间:2018-01-28 01:52:15

标签: r

我正在尝试将基本矩阵从一种类型转换为另一种类型。这似乎是一个非常基本的问题,但令人惊讶的是我没有看到答案。

这是一个简单的例子:

> 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"

是否有直接的方法将矩阵从字符更改为因子并指定级别?

2 个答案:

答案 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会将其强制转换为整数。你可以为它定义自己的类和适当的方法,但这将是更多的工作。