2013-08-03 117 views
0

我有一個問題,在過去的四個小時裏,我無法解決問題,所以我想知道你們中的任何一個人能否幫助我。要看到我的問題,讓我們先從一個例子:R:從矩陣到列表到矩陣:訂單問題

tmp <- matrix(1:24, ncol=2) 
fac <- rep(1:5, length.out=12) 

基於因子水平fac,我想一個函數適用於共享相同因子水平的tmp所有元素。我結束了使用by,但如果這不合適,請不要猶豫,指出。

new <- by(tmp, fac, function(x) x <- x*sign(rbinom(1,1,.5)-0.5)) 

這將使每個組乘以1或-1。

現在的問題:我希望最後得到與之前相同的矩陣,即在我的例子中爲tmp(只是一些觀察組已經與-1相乘)。我曾嘗試以下:

new.tmp <- matrix(unlist(new), ncol=ncol(tmp)) 

但事實證明,該行的順序被混淆。這是可以理解的,因爲by命令將我的矩陣強制爲一個數據幀,並根據我的因子獲取數據幀的子集。有沒有辦法把所有東西放在一起,以保持最初的行順序?

請注意,與我的示例矩陣不同,我的實際數據集在列中沒有有序值。

我真的很感激任何幫助!

回答

3

我認爲這應該工作:

tmp  = matrix(1:24, ncol=2) 
fac  = rep(1:5, length.out=12) 
new  = tapply(fac, fac, function(x) sign(rbinom(1,1,.5)-0.5)) 

new.tmp = tmp*as.numeric(new[fac]) 
+0

裏卡多,太感謝你了!這正是我想要的! – coffeinjunky