2013-09-21 2 views
2

Я чувствую, что на этот вопрос должен был быть дан ответ, но я не нашел его. У меня есть массив, и я хочу подмножить его с помощью вектора. Я знаю, как это сделать, но я уверен, что это будет простой способ. Есть идеи?r подмножество массива с использованием вектора

Вот мой пример:

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.

ответ

3

Вместо вектора можно использовать матрицу:

l[matrix(rep("a", 3), nrow=1)] 
+4

Или просто транспонируйте вектор, используя 't (c (" a "," a "," a "))' –

4

Это уже ответил, но я хотел бы сделать вещи немного более ясно. Давайте ваш пример здесь:

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 создает матрицы в 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 
Смежные вопросы