访问高维表 - 更清晰地索引不同维度的方法?

时间:2011-06-18 13:54:39

标签: r

我想知道是否有更简单的方法来访问表格的不同维度。

我有这段代码

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 个答案:

答案 0 :(得分:2)

我会补充一些数据(提示:包含您自己的数据可以帮助您获得更好的答案; 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

答案 1 :(得分:0)

根据您的描述,您可以使用subset功能:

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

当然,这假设datasettabledata.frame