应用数学函数时如何从具有不同属性的元素的 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)
我在 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)