我有一个for循环,它打印一个结果,只有一个数字和一个i(对于1:10)
(count <- (length(which(colSums(data2[, -8])==0))))
print(i)
当我手动运行循环的所有部分时,它会打印正确的计数(减少值)。我可以手动将excel中的所有值放到绘图中。但是,Id喜欢在我的循环中进行计数,并且我要添加到新的数据框中,所以我可以运行这一千次以获得可靠的结果。
获得如下数据框:
i count
1 10
2 9
3 8
4 6
5 4
6 4
7 4
8 3
9 2
10 0
所以我的问题基本上是:我如何提取'count'和'i'并创建一个数据框以适应这种情况(为每个i创建一行)。
数据集和循环的其余部分与我认为的解决方案无关。
任何帮助都会受到赞赏,欢呼贾斯珀
我当前的循环
for(i in 1:10) {
data2 <- data2[-sample(nrow(data2),size=1,replace=FALSE),]
(count <- (length(which(colSums(data2[, -8])==0))))
print(i)
}
答案 0 :(得分:1)
更有效的方法是首先计算列总和和每个样本的差异:
cs <- colSums(data2[,-8])
nsim <- 10
res <- vector("integer",nsim)
for (i in 1:nsim) res[i] = sum(!(cs - data2[sample(1:nrow(data2),1),-8]))
simres <- data.frame(i=1:nsim,res=res)
请注意length(which(x))
与此处的sum(x)
相同; x==0
为!x
。
评论。如果数据全部为数字,那么将数据存储在matrix
中也是一个好主意,并且此类操作经常发生。
R中有for
个循环的替代品。这是典型的模拟示例:
res <- replicate(nsim,sum(!(cs - data2[sample(1:nrow(data2),1),-8])))
如果你要采集很多样本,你也可以预先计算每一行的行左数值:
norowres <- rowSums(!(cs-data2[,-8])) # not tested
res <- sample(norowres,nsim,replace=TRUE)