让我用简化的例子来描述我的问题
我有一张列联表
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)= 4×3表。现在,我想要一个新的mxn数组,其中第i个入口是估计数据表[i,j]的置信区间(大小为2的列表,如果你愿意)。下面是一个函数,它根据参数a&lt; -datatable [i,j]和b&lt; -datatable [i,n + 1]
计算估计数据表[i,j]的间隔CIfunction<-function(a,b) c(-1,1)+a*b
我希望它不会太乱,我想不出一个更容易的例子。
如何以优雅的方式创建这样的表格?在实际示例中,这是一个应该采用任意列联表并返回相应CI表的函数。
我已经找到了一种方法,在i resp上使用双循环。 j,但它真的闻起来像是可以用优雅的方式使用mapply / outer或者类似的东西。
答案 0 :(得分:0)
下面的代码涉及一些技巧,因为它依赖于R如何回收向量(under what circumstances does R recycle?)。 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
,并仅在打印时计算它们。
答案 1 :(得分: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)
}