массив подмножеств 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.


person mahin    schedule 21.09.2013    source источник


Ответы (2)


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

l[matrix(rep("a", 3), nrow=1)]
person sgibb    schedule 21.09.2013
comment
Или просто транспонируйте вектор, используя t(c("a", "a", "a")) - person Josh O'Brien; 22.09.2013

На этот вопрос уже был дан ответ, но я хотел немного прояснить ситуацию. Возьмем ваш пример здесь:

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