如何从已排序的矩阵列的一部分获取组合名?

时间:2015-07-07 19:09:23

标签: r

我在R中有以下内容:

> require("pls")
> set.seed(42)
> a = matrix(rnorm(12), ncol=4)
> a
           [,1]       [,2]        [,3]       [,4]
[1,]  1.3709584  0.6328626  1.51152200 -0.0627141
[2,] -0.5646982  0.4042683 -0.09465904  1.3048697
[3,]  0.3631284 -0.1061245  2.01842371  2.2866454

> b <- c(1, 2, 3)
> mymodel <- pcr(b ~ a)
> mymodel$loadings

Loadings:
   Comp 1 Comp 2
a1  0.654  0.165
a2  0.136 -0.255
a3  0.415  0.732
a4 -0.618  0.609

> comp1 <- mymodel$loadings[, 1]
> comp1
        a1         a2         a3         a4
 0.6539036  0.1362937  0.4146222 -0.6179988
> sort(comp1, decreasing=TRUE)
        a1         a3         a2         a4
 0.6539036  0.4146222  0.1362937 -0.6179988
> sort(comp1, decreasing=TRUE)[1]
       a1
0.6539036

我真的很困惑comp1是什么:

> colnames(comp1)
NULL
> rownames(comp1)
NULL
> dim(comp1)
NULL
> str(comp1)
 Named num [1:4] 0.654 0.136 0.415 -0.618
 - attr(*, "names")= chr [1:4] "a1" "a2" "a3" "a4"
> typeof(comp1)
[1] "double"

问题:

  1. comp1是什么数据结构?
  2. 如何从排序的comp1中获取列名以获取"a1", "a3", "a2", "a4"

2 个答案:

答案 0 :(得分:1)

这是一个很好的问题,因为这些小但非常重要的区别会让很多新的甚至是中级的R用户烦恼不已。在这种情况下,您对pcr的调用返回了一个名为mymodel的列表。您的问题显示您使用str()方法来检查返回对象,这始终是最佳起点。您还可以参考帮助页面?pcr,该页面解释了返回是命名组件的列表加上“基础拟合函数返回的所有组件”。对于pcr(),基础拟合函数为svdpc.fit,该函数的帮助页面详细说明了my model列表中的其余项目。

从下面可以看出,mymodel$loadings是一个带有两个命名维度的数字向量(通过列表dimnames),也称为矩阵。您使用[运算符来切出第一列(在我的代码中,由“Comp 1”命名,因为如果列顺序发生变化,这更加清晰且不太可能中断)返回一个简单的数字向量因为您只从矩阵中选择了一列。你可以说这不是一个矩阵,因为它没有尺寸,只有一个长度。

> str(mymodel$loadings)
 loadings [1:4, 1:2] 0.654 0.136 0.415 -0.618 0.165 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:4] "a1" "a2" "a3" "a4"
  ..$ : chr [1:2] "Comp 1" "Comp 2"
> is.matrix(mymodel$loadings)
[1] TRUE

> str(mymodel$loadings[, "Comp 1"])
 Named num [1:4] 0.654 0.136 0.415 -0.618
 - attr(*, "names")= chr [1:4] "a1" "a2" "a3" "a4"

> dim(mymodel$loadings[, "Comp 1"])
NULL

当您仅提取单列切片时R降低维度的方式并不总是您希望的行为,特别是如果您要编写返回相同对象类型的通用代码。围绕此问题的一种方法是colnames() 为您工作,就是使用drop = FALSE中的[参数。 (参见?"[")这使矩阵的尺寸和方位保持不变:

> altslice <- mymodel$loadings[, "Comp 1", drop = FALSE]
> colnames(altslice)
[1] "Comp 1"
> dim(altslice)
[1] 4 1
> is.matrix(altslice)
[1] TRUE

答案 1 :(得分:0)

根据@Roland和@ Legalizeit的评论,

答案是使用names