应用数学函数时如何从具有不同属性的元素的 R 列表中提取完整数据?

How to extract the complete data from an R list with elements with different attributes when applying a mathematical function?

我在 mtcars 数据集上执行了 kmeansvar() 并快速浏览了输出内容,如下所示。

>require(ClustOfVar)
>fit <- kmeansvar(X.quanti = mtcars,init = 3)

>var_fit <- fit$var
> var_fit
$cluster1
     squared loading
mpg        0.8823383
cyl        0.8933205
disp       0.9184043
hp         0.7650133
wt         0.8245741

$cluster2
     squared loading
drat       0.7793067
am         0.8509076
gear       0.8415168

$cluster3
     squared loading
qsec       0.8388092
vs         0.7755302
carb       0.7018491

我的下一步要求我提取最大值为squared loading的变量名。

我显然使用了 'lapply' 但我的结果输出如下所示。

$cluster1
[1] 0.9184043

$cluster2
[1] 0.8509076

$cluster3
[1] 0.8388092

我的预期输出是:

$cluster1
     squared loading
disp       0.9184043

$cluster2
     squared loading

am         0.8509076


$cluster3
     squared loading
qsec       0.8388092

或者,更准确地说,我需要的值是:

cluster1 disp
cluster2 am
cluster3 qsec

如何提取列表中元素的属性?

我们可以用sapply遍历list,用which.max得到max值的索引,提取索引对应的行名。

sapply(var_fit, function(x) row.names(x)[which.max(x)])
#cluster1 cluster2 cluster3 
# "disp"     "am"   "qsec" 

我也会用 lapply 做,稍加改动:

res1 <- lapply(var_fit, function(x) x[which.max(x),,drop=FALSE])

要获取行的名称,我会使用与@akrun 提出的方法几乎相同的方法。但是通过 res1:

可以获得相同的结果
res2 <- sapply(res1, rownames)