set.seed(42) > a = matrix(rnorm(12), ncol=4) > a [,1] -6ren">
gpt4 book ai didi

r - 如何从已排序矩阵列的一部分中获取列名?

转载 作者:行者123 更新时间:2023-12-02 03:24:17 27 4
gpt4 key购买 nike

我在 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"

最佳答案

在很多方面都是一个好问题,因为这些小但非常重要的区别让许多新的甚至中级 R 用户感到烦恼。在这种情况下,您对 pcr 的调用返回了一个名为 mymodel 的列表。您的问题显示您使用 str() 方法检查返回对象,这始终是最好的起点。您还可以查阅帮助页面 ?pcr,其中解释了返回值是一个命名组件列表以及“由底层 fit 函数返回的所有组件”。对于 pcr(),底层拟合函数是 svdpc.fit,该函数的帮助页面详细介绍了 我的模型 中的其余项目列表。

正如您从下面看到的,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 降低维度的方式并不总是您希望的行为,尤其是当您想要编写返回相同对象类型的通用代码时。解决此问题的一种方法是在 [。 (参见 ?"[")这会保留矩阵及其维度和维度名称:

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

关于r - 如何从已排序矩阵列的一部分中获取列名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31277315/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com