2013-07-31 94 views
0

我希望主題行很清晰...我有一個矩陣列表。在每個矩陣中,我想要一個包含行的最大值的列名向量。實際上這些向量的列表。簡單的例子:如何從列表中的每個矩陣中獲取矩陣中每行的最大值的列名?

a = c(1,1,3) 
b = c(7,2,1) 
c = c(2,4,2) 

d1 = cbind(a,b,c) 

d = c(2,1,6) 
e = c(1,4,2) 
f = c(4,8,4) 

d2 = cbind(d,e,f) 

l = list(d1,d2) 

l 
[[1]] 
    a b c 
[1,] 1 7 2 
[2,] 1 2 4 
[3,] 3 1 2 

[[2]] 
    a b c 
[1,] 2 1 4 
[2,] 1 4 8 
[3,] 6 2 4 

我接近。這讓我的最高值的指標:

lapply(l,function(y) apply(y, 1, function(x) which (x==max(x)))) 
[[1]] 
[1] 2 3 1 

[[2]] 
[1] 3 3 1 

但是,這是所有我能鼓起得到的列名:

lapply(l,function(y) apply(y, 1, function(y) colnames(y)[function(x) which (x==max(x))])) 
[[1]] 
NULL 

[[2]] 
NULL 

我追求的是:

[[1]] 
[1] 'b', 'c', 'a' 

[[2]] 
[1] 'c', 'c', 'a' 

在更簡單的表達式中,colnames(matrixFrameName)[expression returning indexes]按我的預期工作;不是在這種情況下。有人可以幫忙嗎? THX ...

+0

你舉的例子是矩陣的一個列表,而不是data.frames列表... – mnel

+0

THX,編輯;這是一個簡化的可重複性..我的應用程序需要數據幀和時間序列 – StatsViaCsh

+0

對數據幀的逐行計算速度慢並且效率低下。 ('apply'強制data.frames到矩陣,'data.frames'按列存儲 – mnel

回答

4

嘗試:

lapply(l,function(y) colnames(y)[apply(y, 1, which.max)]) 

## [[1]] 
## [1] "b" "c" "a" 
## 
## [[2]] 
## [1] "f" "f" "d" 
+0

非常棒,謝謝。 – StatsViaCsh

相關問題