1

例如,我有一个矩阵:

> a = cbind(sample(c(0,1),6,replace=T), sample(c(0,1),6,replace=T))
> a
     [,1] [,2]
[1,]    0    0
[2,]    0    0
[3,]    0    1
[4,]    1    0
[5,]    1    0
[6,]    1    1

我想制作一个对象ba所以这b是一个因素,每个级别代表a. 在这种情况下,b将是:

> b
[1] 1 1 2 3 3 4
Levels: 1 2 3 4

我可以用肮脏的方式做到这一点,但我想知道是否有一个优雅的解决方案?

4

3 回答 3

4

不知道您当前的“肮脏”方式是什么,这是一个可能的解决方案:

> aFac <- interaction(data.frame(a), lex.order=TRUE)
> factor(aFac, levels = levels(aFac), labels = seq_along(levels(aFac)))
[1] 1 1 2 3 3 4
Levels: 1 2 3 4

在哪里:

a <- structure(c(0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 1L), 
               .Dim = c(6L, 2L), .Dimnames = list(NULL, NULL))

我使用的唯一原因lex.order = TRUE是匹配您的特定输出。


另一种可能是:

> aFac <- interaction(data.frame(a), lex.order=TRUE, drop = TRUE)
> factor(as.numeric(aFac))
[1] 1 1 2 3 3 4
Levels: 1 2 3 4

drop = TRUE是从 中删除任何未使用的级别interaction,正如我们将在下面的评论中的示例中得到的那样。

为了证明 的影响drop = TRUE,请考虑以下因素,并注意产生的因子水平:

> b <- structure(c(1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1), .Dim = c(6L,2L))
> bFac1 <- interaction(data.frame(b), lex.order=TRUE)
> bFac2 <- interaction(data.frame(b), lex.order=TRUE, drop=TRUE)
> factor(as.numeric(bFac1))
[1] 3 4 3 2 2 4
Levels: 2 3 4
> factor(as.numeric(bFac2))
[1] 2 3 2 1 1 3
Levels: 1 2 3
于 2013-04-11T07:26:32.570 回答
4

一个可能的解决方案:

 b <- apply(a, 1, paste, collapse="_")
 b <- factor(b, levels=unique(b), labels=1:length(unique(b)))
于 2013-04-11T07:27:30.830 回答
1

根据数据的简单性,以下可能是一种方法。

a
##      V1 V2
## [1,]  0  0
## [2,]  0  0
## [3,]  0  1
## [4,]  1  0
## [5,]  1  0
## [6,]  1  1

hash <- apply(a, 1, paste, collapse = "/")
b <- factor(hash, labels = 1:length(unique(hash)))
b
## [1] 1 1 2 3 3 4
## Levels: 1 2 3 4
于 2013-04-11T07:28:33.573 回答