0

让我通过一个简化的例子来描述我的问题

我有一个应急表

datatable<-array(c(1,2,3,4,5,6,dim=c(3,2))
datatable<-cbind(datatable,rowSums(datatable))
datatable<-rbind(datatable,colSums(datatable))

这里,m=3,n=2 这是一个 (m+1)x(n+1)=4x3 表。现在,我想要一个新的 mxn 数组,其中第 ij 个入口是估计数据表 [i,j] 的置信区间(如果你愿意的话,是一个大小为 2 的列表)。下面是一个函数,它根据参数 a<-datatable[i,j] 和 b<-datatable[i,n+1] 计算估计 datatable[i,j] 的区间

CIfunction<-function(a,b) c(-1,1)+a*b

我希望它不会太乱,我想不出一个更简单的例子。

我如何以优雅的方式创建这样的表格?在实际示例中,这是一个应该采用任意列联表并返回相应 CI 表的函数。

我已经找到了一种方法,分别在 i 上使用双循环。j,但它真的闻起来像可以使用 mapply/outer 或类似的优雅方式完成的事情。

4

2 回答 2

0

下面的代码涉及一些技巧,因为它依赖于 R 如何回收向量(在什么情况下 R 回收?)。array对象只是折叠的matrix向量(按列存储)。一旦你了解了这种行为,想出这样的技巧并不难

datatable <- array (1:6, dim=c(3,2))
datatable <-cbind(datatable,rowSums(datatable))
datatable <-rbind(datatable,colSums(datatable))

# last column recycled as necessary
lower <- -datatable[1:3, 1:2] * datatable[1:3, 3]  
upper <- -lower
CIlist <- list(lower, upper)

但是,我确实建议您在datatable不存储行和列总计的情况下进行存储,并且仅在打印时计算它们。

于 2014-10-14T14:48:53.937 回答
0

感谢您的评论和回答。我在将 ilir 提供的(优雅的)方法推广到任意 CI 函数时遇到了一些麻烦。我最终只是做了上面提到的双循环。我对上述问题的解决方案类似于

CItable<-function(datatable,CIfunction)
{
 m<-dim(datatable)[1]-1
 n<-dim(datatable)[2]-1

 CItable<-array(NA,dim=c(m,2*n))
 for(i in 1:m)
   {
    for(j in 1:n)
     {
      tempint<-CIfunction(datatable[i,j],datatable[i,n+1])
      CItable[i,2*j]<-tempint[2]
      CItable[i,2*j-1]<-tempint[1]
     }

   }
return(CItable)
}
于 2014-10-16T14:45:58.050 回答