2013-04-11 120 views
1

例如,我有一個矩陣:如何將行轉換爲R中的因子?

> 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 

我可以做一個骯髒的方式,但我不知道是否有一個優雅的解決方案嗎?

+0

數據集有多大? 'a'總會有2列嗎? 'a'總是隻包含'整數',只包含'數字'還是隻包含'字符'? – 2013-04-11 07:22:13

+0

什麼是您目前使用的「髒」方式?我們如何確保我們的方式不髒? – A5C1D2H2I1M1N2O1R2T1 2013-04-11 07:23:15

+0

骯髒的方式,我認爲是使用'粘貼'連接每一行。但是我忘了我也可以使用'apply'函數來進行矢量化。 – RNA 2013-04-11 15:19:25

回答

4

一個可能的解決方案:

b <- apply(a, 1, paste, collapse="_") 
b <- factor(b, levels=unique(b), labels=1:length(unique(b))) 
+0

這是我最初的想法,我認爲'粘貼'會比'交互'更快,但不知道OP已經嘗試過什麼。 – A5C1D2H2I1M1N2O1R2T1 2013-04-11 07:52:06

+0

@AnandaMahto我會說,它一如既往取決於數據量。當這個增長時,粘貼比交互更快。 – droopy 2013-04-11 08:34:02

+1

這不僅僅是數據量。隨着交互次數的增加,由於粘貼是矢量化的,它肯定會更快。添加'drop = FALSE'會加快'interaction'的速度,但我不知道多少。 – A5C1D2H2I1M1N2O1R2T1 2013-04-11 08:40:50

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 
+0

+1,不瞭解互動 – 2013-04-11 07:29:59

+1

@DidzisElferts,已更新。如果指定了級別,則工作。 – A5C1D2H2I1M1N2O1R2T1 2013-04-11 07:48:19

+0

+1 interaction'()' – RNA 2013-04-11 15:22:18

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 
+0

因爲你的回答晚於下垂,我接受了下垂的答案。但是謝謝! +1 – RNA 2013-04-11 15:20:15