2013-03-25 56 views
2

對於我來說,這是一個簡單而又荒唐可笑的過程。 我想弄清楚如何從數據中創建一組矩陣。在依賴列中拆分R中的矩陣或數據集

如果你有R,

data(iris) 
dim(iris) 

[1] 150 5 

是dimesion

光圈R中給定的數據編程

當你

iris(3) 
dim(iris3) 

[1] 50 4 3 

你得到一組三個矩陣分爲「物種」從屬列

我如何編程/代碼,所以我可以做到這一點爲其他數據集?

感謝您的時間和參觀

+2

我不明白你在做什麼。虹膜(3)'不做任何事情,並在這裏引發錯誤。 – juba 2013-03-25 14:43:18

+1

(+1)@juba。不太清楚。我的猜測是,你正在尋找'分裂(虹膜,虹膜$物種)'。 – Arun 2013-03-25 14:45:47

+0

是的,拆分(虹膜,虹膜$物種)是我想要的,但拆分(虹膜,虹膜$物種)具有所有物種名稱列。請注意虹膜3有三個矩陣,分別爲50和4. – user2201675 2013-03-25 14:50:24

回答

3

你從abind包尋找abind功能:

> library(abind) 
> IrisArray <- abind(split(iris[, -5], iris[,5]), along=3) 
> dim(IrisArray) 
[1] 50 4 3 # these are the dimensions you want. 

如果你想爲這一個功能,再看看這個:

library(abind) 
Splitbyfactor <- function(x, by='Species'){ 
    ind <- which(colnames(x)==by) 
    abind(split(x[, -ind], x[,ind]), along=3) 
} 

dim(Splitbyfactor(iris, by='Species')) 
[1] 50 4 3 

編輯

這編輯是爲了回答你的評論,假設你有一個名爲df的數據框架,它由兩列隨機數和第三列包含ID組成,這些ID是大寫字母A,B,C,D,E和F,這意味着你有5個不同的ID進行拆分,那麼調用中的along參數不一定要設置爲5,因爲它沒有引用ID的數量,它指的是生成數組的維數;)。看到這個例子

> df <- data.frame(A=rnorm(10), B=rnorm(10), ID=rep(LETTERS[1:5], each=6)) 
> dim(df) 
[1] 30 3 
> dim(Splitbyfactor(df, by='ID')) 
[1] 6 2 5 
+0

這很好,但是我可以有一個比3更好的方法嗎?由於Iris有3個物種,它似乎是3個,但我的數據需要10個。 – user2201675 2013-03-25 14:55:32

+0

如果你的數據有10個物種,它將被考慮在內,而'Splitbyfactor'會給你你所期待的。 ;) – 2013-03-25 14:58:07