将循环结果插入数据框

时间:2015-05-18 14:29:43

标签: r loops dataframe

我有一个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)

}

1 个答案:

答案 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)