2013-07-31 95 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

相关问题