gpt4 book ai didi

r - 始终将子集矩阵转换为向量并避免使用列名?

转载 作者:行者123 更新时间:2023-12-04 21:45:22 25 4
gpt4 key购买 nike

我想知道是否有 R 语法可以从矩阵中提取一列,并且在返回的向量上始终没有 name 属性(我希望依赖于这种行为)。

我的问题是以下不一致:

  • 当矩阵有不止一行时,我做 myMatrix[, 1]我会得到myMatrix的第一列没有名称属性。这就是我要的。
  • 当矩阵有 正好一排我做 myMatrix[, 1] ,我会得到myMatrix的第一列但它的名字是第一个列名 .

  • 我希望能够做到 myMatrix[, 1]并始终通过 获得一些东西没有名字 .

    一个例子来证明这一点:
    # make a matrix with more than one row,
    x <- matrix(1:2, nrow=2)
    colnames(x) <- 'foo'
    # foo
    # [1,] 1
    # [2,] 2

    # extract first column. Note no 'foo' name is attached.
    x[, 1]
    # [1] 1 2

    # now suppose x has just one row (and is a matrix)
    x <- x[1, , drop=F]
    # extract first column
    x[, 1]
    # foo # <-- we keep the name!!
    # 1

    现在, [ 的文档( ?'[' ) 提到了这种行为,所以它不是错误或任何东西(尽管,为什么?!为什么会出现这种不一致?!):

    A vector obtained by matrix indexing will be unnamed unless ‘x’ is one-dimensional when the row names (if any) will be indexed to provide names for the result.



    我的问题是 ,有没有办法做 x[, 1]这样结果总是未命名的,其中 x是矩阵?

    是我唯一的希望 unname(x[, 1])或者是否有类似于 [ 的东西的 drop争论?或者是否有一个选项我可以设置为“始终未命名”?我可以使用的一些技巧(以某种方式覆盖 [ 当提取的结果是向量时的行为?)

    最佳答案

    更新为什么下面的代码有效 (据我所知)

    使用 [ 进行子集化使用包含在 R 源文件中的函数处理 subset.c ~/src/main .当使用矩阵索引对矩阵进行子集化时,函数 VectorSubset叫做。当使用多个索引时(即,行和列各一个,如 x[,1] ),则 MatrixSubset叫做。

    函数VectorSubset仅将名称分配给子集化的一维数组。由于矩阵是二维数组,因此在使用矩阵索引时不会为结果分配名称。函数MatrixSubset但是,在某些情况下确实会尝试传递dimnames。

    因此,您在帮助页面的引用中引用的矩阵索引似乎是关键:

    x <- matrix(1)
    colnames(x) <- "foo"
    x[, 1] ## 'Normal' indexing
    # foo
    # 1
    x[matrix(c(1, 1), ncol = 2)] ## Matrix indexing
    # [1] 1

    并使用更宽的 1 行矩阵:
    xx <- matrix(1:10, nrow = 1)
    colnames(xx) <- sprintf('foo%i', seq_len(ncol(xx)))
    xx[, 6] ## 'Normal' indexing
    # foo6
    # 6
    xx[matrix(c(1, 6), ncol = 2)] ## Matrix indexing
    # [1] 6

    对于两个维度 > 1 的矩阵:
    yy <- matrix(1:10, nrow = 2, dimnames = list(NULL,
    sprintf('foo%i', 1:5)))

    yy[cbind(seq_len(nrow(yy)), 3)] ## Matrix indexing
    # [1] 5 6

    关于r - 始终将子集矩阵转换为向量并避免使用列名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15215355/

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