我有简单的循环,在每一步生成一个值,我想将所有结果保存为单个表。问题是每一步都会覆盖前一步。
for(i in 1:5){
x = 3*i
print(c(i,x))
}
这给出了
[1] 1 3
[1] 2 6
[1] 3 9
[1] 4 12
[1] 5 15
现在我创建一个矩阵,然后我将其保存为csv文件,但它只显示循环的最后一步。
results = matrix(c(i,x), ncol = 2)
[,1] [,2]
[1,] 5 15
write.table(results, file = "Results.csv", col.names=NA, append = T)
如何显示整个结果列表?提前谢谢!
(ps.-我知道之前已经发布了一个类似的问题,例如Write output of R loop to file,但问题非常具体,我没有设法让答案适应我的情况。)
答案 0 :(得分:3)
您通常可以使用sapply
代替for
- 循环:
results <- t(sapply(1:5, function(x) c(x, 3*x)))
write.table(results, file="Results.csv", col.names=NA, append=T)
答案 1 :(得分:2)
您的循环仅向控制台打印结果。您创建的矩阵仅依赖于i
的单个(和最后一个)值。有很多方法可以做到,但如果你真的想写一个矩阵,那么你需要将它们存储在某个地方以导出所有迭代中间结果。您可以尝试以下方式:
results <- matrix(NA, nrow=5, ncol=2)
for(i in 1:5){
results[i, ] <- c(i, 3*i)
}
write.table(results, file = "Results.csv", col.names=NA, append = T)
顺便说一下,你真的不需要循环:
i <- 1:5
m <- matrix(c(i, 3*i), nrow=5)
可以胜任。
答案 2 :(得分:0)
假设您确实需要/需要for
- 循环
1)将所有结果存储到矩阵中,然后将整个矩阵写入文件
n = 5;
results = matrix(NA, ncol=2, nrow=n);
for(i in 1:n) {
results[i, ] = c(i, x);
}
write.table(results, file = "Results.csv", col.names=NA, append = T);
如果您没有很多结果并且只想访问该文件一次,这是一个“好”的解决方案。
2)您只将当前结果存储到矩阵中,并在每次迭代时写入文件
n = 5;
for(i in 1:n) {
results = matrix(c(i,x), ncol = 2)
write.table(results, file = "Results.csv", col.names=NA, append = T);
}
如果您有许多数据和内存限制,这是一个“好”的解决方案。可能比前一个慢,因为你会多次打开文件......
答案 3 :(得分:0)
要使用矩阵附加,您可以使用:
exampleMatrix <- matrix(ncol = 2)
for(i in 1:5){
x = 3*i
if(i ==1){
exampleMatrix<- rbind(c(x,i))
}else{
exampleMatrix<- rbind(exampleMatrix,c(x,i))
}}
要使用循环附加到数据框,您可以使用以下内容:
exampleDF <- data.frame()
for(i in 1:5){
x = 3*i
exampleDF <- rbind(exampleDF,c(x,i))
}
write.csv(exampleDF, "C:\\path")
答案 4 :(得分:-1)
因此,当您想在使用循环时存储值时,索引很重要。下面,我创建了一些代码,其中a
(迭代)和x
(值x * 3
)都存储在向量中。
循环结束后,我将两个向量合并为一个具有cbind()
函数的数据框
a <- vector()
x <- vector()
for(i in 1:5){
a[i] = i
x[i] = 3*i
}
df <- as.data.frame(cbind(a, x))
还有其他方法可以在没有循环的情况下执行此操作。一旦开始提高迭代次数或执行嵌套循环,处理时间就会变得非常高。其他选项位于apply package。
希望这有帮助!