2012-02-04 84 views
5

對不起,我想不出更多的信息標題,但這是我的挑戰。我有一個矩陣,我需要根據矢量描述的參數在特定位置添加列。例如,如果我有以下矩陣:如何添加列來擴展R中的矩陣

1, 0, 1, 2, 0 
0, 0, 1, 1, 1 
1, 1, 0, 0, 0 
2, 0, 1, 0, 2 

但是對於特定的R軟件包(未標記),我需要在特定位置添加NA列。我有與在矩陣的列向量:

1, 1, 1, 2, 3 

這表明柱1-3分別來自同一個採樣週期和4列和5分別來自不同的取樣週期。我需要使矩陣中的列數等於從相同採樣週期乘以採樣週期數的最大數量。在這種情況下,有三個1(向量中任意唯一值的最大數)和總共三個採樣週期(向量中的最大數)。所以我需要一個有9列(3 x 3)的矩陣。具體來說,我需要在第4列和第5列之後添加新的NAs列。基本上,我只需要NAs列作爲佔位符,以便在每個採樣週期(由向量中的數字表示)中觀察值(每列)的數量相同(= 3)的矩陣中。這是很難形容,但在這個假想的例子中,我想直到結束:

1, 0, 1, 2, NA, NA, 0, NA, NA 
0, 0, 1, 1, NA, NA, 1, NA, NA 
1, 1, 0, 0, NA, NA, 0, NA, NA 
2, 0, 1, 0, NA, NA, 2, NA, NA 

這將通過一個看起來像一個矢量來描述:

1, 1, 1, 2, 2, 2, 3, 3, 3 

雖然我實際上並不需要產生這個向量,就是矩陣。顯然,在這種情況下很容易添加這些列,但是對於我的數據,我有一個更大的矩陣,最終會有大約200列。另外,我可能必須爲大量數據集執行此操作。

任何人都可以幫助我在R中編寫代碼,以便我可以自動擴展矩陣的過程?

感謝您的任何意見或建議!


編輯: 使事情更相似一點在這裏我的實際數據是可重複的矩陣和相似的載體以我目前的:

m <- matrix(rpois(120*26, 1), nrow = 120, ncol = 26) 
    v <- c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 5, 5, 6, 6, 6, 6, 7) 
+0

好的,所以你說你不必生成矢量,因此它不存在......你已經有什麼信息表明哪個採樣週期的列數最多?或者,你是否知道這是前3個,並且僅僅是在你的200的每個附加列之後插入兩個新的問題? – John 2012-02-04 17:23:26

+0

對不起,我從我的抽樣和矩陣創建中總會知道哪個採樣週期的列數最多,數量多少。這些列總是相鄰的,但可能發生在矩陣的任何地方。由於易於使用,我總是可能創建第一個向量,我的意思是我不需要創建與最終關係相對應的第二個向量,因爲它總是隻是每個主要週期的最大觀察值(列)的倍數。 – djhocking 2012-02-04 17:50:38

+1

只需'cbind(mat [,1:3],nas,nas,mat [,4:5]'(使用來自Johns答案的'nas'的定義)就可以用於小集合。你從來沒有看到'1,1,1,2,2,1,1,3,3'嗎?我正在考慮簡單的函數來生成新的NA列的位置,這就是爲什麼我問。還想問問你發送最終矩陣的包或函數?如果我們知道你需要完成什麼,通常有更好的方法來組裝你的數據。填充所有這些NAs可能不是最好的解決方案: - ) – 2012-02-04 17:50:54

回答

4

假設m是矩陣和v是矢量,您可以使用類似

t = table(v) 
size = dim(m)[1] * max(t) # size of each block based on the longest 
matrix(unlist(lapply(names(t), function(i) { 
       x = m[, v == i]     # get the short block 
       c(x, rep(NA, size - length(x))) # extend it to size 
     })), dim(m)[1]) 
+0

工作完美,謝謝! – djhocking 2012-02-04 20:27:46

1

剛纔修改的矩陣,你問假設矩陣是墊:

nr <- nrow(mat) 
nas <- rep(NA, nr) 
l <- lapply(4:ncol(mat), function(x) matrix(c(mat[,x],nas,nas), nrow = nr)) 
cbind(mat[,1:3], do.call(cbind,l))