我对这个简单的循环感到很困惑。为什么它不起作用?
set.seed(123)
out1<-data.frame(y1=rbinom(10, 1, 0.3),
y2=rbinom(10, 1, 0.4),
y3=rbinom(10, 1, 0.5),
y4=rbinom(10, 1, 0.6))
out<-NULL
for(i in 1:10){
out[i, ]<-out1[i, ]
}
Error in out[i, ] <- out1[i, ] : incorrect number of subscripts on matrix
答案 0 :(得分:1)
我宁愿绕过列表,因为使用for
循环创建矩阵会变得非常麻烦(参见例如Stepwise creation of one big matrix from smaller matrices in R for-loops)。因此,我的解决方案是:
# Prepare emtpy list:
out <- list()
for(i in 1:10){
# Store everything in list:
out[[i]]<-out1[i, ]
# Bind elements rowwise into matrix:
Z <- do.call(rbind, out)
}
这将为您提供矩阵Z
作为输出,与原始矩阵out1
相同。您可以通过调用identical(out1, Z)
来验证这一点,TRUE
如果out1
与Z
相同,则输出{{1}}。
答案 1 :(得分:1)
这是修复代码而无需使用out
10x4预分配dim()
的方法。但请注意,使用rbind()
是一种非常低效的代码编写方式。你应该预先分配。
out1<-data.frame(y1=rbinom(10, 1, 0.3),
y2=rbinom(10, 1, 0.4),
y3=rbinom(10, 1, 0.5),
y4=rbinom(10, 1, 0.6))
out<-NULL
for(i in 1:10){
out <- rbind(out, out1[i, ])
}