我在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"
问题:
"a1", "a3", "a2", "a4"
? 答案 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