【发布时间】:2019-08-16 06:36:22
【问题描述】:
我创建的 for 循环根据观察值计算预期值并将其存储在新的列联表中(我之前制作的副本)。 要计算预期,您将行总和和列总和相乘,然后除以总数。
我创建了一个嵌套在另一个 for 循环中的 for 循环,该循环遍历观察到的列联表并计算预期值,然后将其存储在新的预期表中,但是,在运行代码时,它只计算最后一次迭代或来自数据[3,3]。
The observed table w added margins:
Frequently Never Rarely Sum
Conservative 15 214 47 276
Liberal 119 479 173 771
Other 85 172 45 302
Sum 219 865 265 1349
The expected table:
Frequently Never Rarely
Conservative 15 214 47
Liberal 119 479 173
Other 85 172 45
viewsandpot 是我命名的数据,我已经作为文件读取(所以它是一个表)。
expecteddata <- function(rawdata){
observedtable <- table(factor(rawdata[,2]), factor(rawdata[,1]))
observedtable <- addmargins(observedtable)
expectedtable <- observedtable
i <- 1
j <- 1
ncol <- ncol(observedtable)
nrow <- nrow(observedtable)
for(i in nrow-1){
j <- 1
for(j in ncol-1){
expectedtable[i,j] <- (observedtable[i, ncol]*observedtable[nrow, j])/observedtable[ncol, nrow]
j <- j+1
}
}
return(expectedtable)
}
expecteddata(viewsandpot)
预期值列联表应该看起来像观察到的计数,但替换为计算值(数字应该不同)。
只有最后一次迭代有效 - 我从代码中得到的结果是:
Frequently Never Rarely
Conservative 15.00000 214.00000 47.00000
Liberal 119.00000 479.00000 173.00000
Other 85.00000 172.00000 59.32543
所以 59.325 是唯一不同的数字。
不知道为什么循环不起作用,考虑到内部 for 循环首先替换整个第一行,然后转到下一行。
【问题讨论】:
-
附带说明,如果
tab是您的原始表,没有添加任何列或行总和,这只是chisq.test(tab)$expected。 -
您的
for循环仅“循环”通过一个值,您需要像for (i in 1:(nrow-1))这样的序列。我总是犯这个错误。 -
我们如何获得您想要的数字输出?
标签: r loops for-loop datatable return