gpt4 book ai didi

arrays - 使用向量的 r 子集数组

转载 作者:行者123 更新时间:2023-12-02 05:38:07 27 4
gpt4 key购买 nike

我觉得这个问题应该已经有了答案,但我没有找到。我有一个数组,我想使用向量对其进行子集化。我知道如何以困难的方式做到这一点,但我确信一定有一种简单的方法。有什么想法吗?

这是我的例子:

dat <- data.frame(a = rep(letters[1:3], 2), b = rep(letters[1:2], 3), c = c(rep("a", 5), "b"), x = rnorm(6), stringsAsFactors = FALSE)

l <- by(dat[ , "x"], dat[ , 1:3], mean)

l["a", "a", "a"] # works
l[c("a", "a", "a")] # does not work

所以我想我需要一种方法在传递之前删除 c() 包装形式 c("a", "a", "a")l

最佳答案

这个问题已经得到了回答,但我想让事情变得更清楚一些。让我们以您的例子为例:

dat <- data.frame(a = rep(letters[1:3], 2), b = rep(letters[1:2], 3), c = c(rep("a", 
5), "b"), x = rnorm(6), stringsAsFactors = FALSE)

l <- by(dat[, "x"], dat[, 1:3], mean)

l["a", "a", "a"] # works

## [1] 1.246

l[c("a", "a", "a")] # does not work

## [1] NA NA NA

之前的答案建议在子集化中使用matrix(rep("a", 3), nrow=1)。我想详细解释一下为什么这有效。首先,我们来看看是什么这两种数据结构之间的区别是:

a.mat <- matrix(rep("a", 3), nrow = 1)
a.vec <- c("a", "a", "a") # Note: this is equivalent to rep('a', 3)
a.mat

## [,1] [,2] [,3]
## [1,] "a" "a" "a"

a.vec

## [1] "a" "a" "a"

as.matrix(a.vec)

## [,1]
## [1,] "a"
## [2,] "a"
## [3,] "a"

l[a.mat]

## [1] 1.246

l[a.vec]

## [1] NA NA NA

l[as.matrix(a.vec)]

## [1] NA NA NA
当您将

a.mata.vec 打印到屏幕上时,它们看起来相同,但它们并非如此以同样的方式处理,因为 R 在 Column Major Order 中创建矩阵因为它逐列写入和读取矩阵。当您使用矩阵进行子集化时,它将使用每一列作为不同的维度。如果矩阵中的列数与要子集化的对象中的维度数匹配,则它将使用每一列作为每个后续维度。

如果列数不匹配,R 会将矩阵折叠为向量并尝试以这种方式匹配元素索引。以下是更多示例:

a.mat[, -1]  # Now only two columns

## [1] "a" "a"

l[a.mat[, -1]] # Notice you get NA twice here.

## [1] NA NA

l[matrix(rep("a", 4), nrow = 1)] # Using a matrix with 4 columns.

## [1] NA NA NA NA

顺便说一句,当您使用字符向量进行子集化时,R 将尝试匹配任何元素名称。如果它们不存在,您将收到 NA 或错误:

# Vector example:
x <- letters
x[1]

## [1] "a"

x["a"]

## [1] NA

names(x) <- letters
x[1]

## a
## "a"

x["a"]

## a
## "a"

x[c("a", "a", "a")]

## a a a
## "a" "a" "a"

x[a.mat] # collapsing matrix down to a vector.

## a a a
## "a" "a" "a"
# Matrix example:
x <- matrix(letters[1:9], nrow = 3, ncol = 3)
x

## [,1] [,2] [,3]
## [1,] "a" "d" "g"
## [2,] "b" "e" "h"
## [3,] "c" "f" "i"

x[c(1, 1)]

## [1] "a" "a"

x[1, 1]

## [1] "a"

x[c("a", "a")]

## [1] NA NA

x["a", "a"]

## Error: no 'dimnames' attribute for array

rownames(x) <- letters[1:3]
colnames(x) <- letters[1:3]
x

## a b c
## a "a" "d" "g"
## b "b" "e" "h"
## c "c" "f" "i"

x[c(1, 1)]

## [1] "a" "a"

x[1, 1]

## [1] "a"

x[c("a", "a")]

## [1] NA NA

x["a", "a"]

## [1] "a"

最后,如果您使用数字向量,您将始终获得一个定义的值(除非它超出范围):

l[c(1,1,1)]

## [1] 1.246 1.246 1.246

l[1, 1, 1]

## [1] 1.246

关于arrays - 使用向量的 r 子集数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18936833/

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