例如,我有一个矩阵:
> 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
我想从b
中创建一个对象a
,以便b
是一个因素,每个级别代表a
中的不同行。在这种情况下,b
将是:
> b
[1] 1 1 2 3 3 4
Levels: 1 2 3 4
我可以用脏的方式做,但我想知道是否有一个优雅的解决方案?
答案 0 :(得分: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
答案 1 :(得分:4)
可能的解决方案:
b <- apply(a, 1, paste, collapse="_")
b <- factor(b, levels=unique(b), labels=1:length(unique(b)))
答案 2 :(得分: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