На этот вопрос уже был дан ответ, но я хотел немного прояснить ситуацию. Возьмем ваш пример здесь:
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.mat
и a.vec
выглядят одинаково, когда вы выводите их на экран, но они не обрабатываются одинаково, потому что R создает матрицы в Основной порядок столбцов тем, что он записывает и читает столбец матрицы за столбцом. Когда вы используете матрицу для подмножества, она будет использовать каждый столбец как отдельное измерение. Если количество столбцов в матрице совпадает с количеством измерений в объекте, подлежащем поднабору, каждый столбец будет использоваться для каждого последующего измерения.
Если количество столбцов не совпадает, 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
person
ZNK
schedule
21.09.2013