Доступ к таблицам больших размеров - более понятный способ индексировать различные измерения? - PullRequest
2 голосов
/ 18 июня 2011

Мне было интересно, есть ли более простой способ доступа к различным измерениям таблицы.

У меня есть этот код

datasettable = addmargins(
  table(dataset[c('observer','condition','stimulus1', 'stimulus2','response')]), 
  4, FUN = sum)

И я получаю к нему доступ следующим образом:

datasettable[,'u',1,'sum',]

Однако, я нахожу доступ к нему таким путаницей.Поскольку индексы для разных измерений разделяются запятой, индексы для разных измерений легко спутать.

Существует ли способ определить индексы для разных измерений по имени (особенно важно для числовых индексов)) например, с

datasettable ['obsever'=='ALL','condition'=='u',
  'stimulus1'==1, 'stimulus2'=='sum','response'=='ALL']

Ответы [ 2 ]

2 голосов
/ 18 июня 2011

Я сделаю некоторые данные (подсказка: включение ваших собственных данных поможет вам получить лучшие ответы; dput может быть отличным инструментом для этого).

dataset <- expand.grid(observer=LETTERS[1:3], condition=c("u","v"), 
                       stimulus1=1:2, stimulus2=1:2)
set.seed(5)
dataset$response <- sample(1:4, nrow(dataset), replace=TRUE)
datasettable <- addmargins(table(dataset), 4, FUN = sum)

Что вы предлагаете, так это:

> datasettable[,'u',1,'sum',]
        response
observer 1 2 3 4
       A 1 1 0 0
       B 0 0 2 0
       C 0 1 0 1

Возможно, я получу сумму без предварительного преобразования в таблицу, возможно, используя пакет reshape, например:

> library(reshape)
> dw <- cast(dataset, condition + stimulus1 + observer ~ response, 
             fun.aggregate=length, value="stimulus2")
> subset(dw, condition=="u" & stimulus1==1)
  condition stimulus1 observer 1 2 3 4
1         u         1        A 1 1 0 0
2         u         1        B 0 0 2 0
3         u         1        C 0 1 0 1

Но чтобы ответить на ваш вопрос,нет, я не думаю, что есть альтернативный способ для доступа к частям таблицы, но вы наверняка могли бы создать его, например, так:

tableaccess <- function(tabl, ...) {
  d <- list(...)
  vv <- c(list(tabl), as.list(rep(TRUE, length(dim(tabl)))))
  vv[match(names(d), names(dimnames(datasettable)))+1] <- d
  do.call(`[`, vv)
}

с результатом

> tableaccess(datasettable, condition='u', stimulus1=1, stimulus2='sum')
        response
observer 1 2 3 4
       A 1 1 0 0
       B 0 0 2 0
       C 0 1 0 1
0 голосов
/ 18 июня 2011

Для того, что вы описали, вы можете использовать функцию subset:

subset(datasettable, observer == 'ALL' & condition == 'u' &
       stimulus1 == 1 & stimulus2 == 'sum' & response == 'ALL')

Это, конечно, предполагает, что datasettable является data.frame.

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