gpt4 book ai didi

r - 将 for 循环的结果分配给空矩阵

转载 作者:行者123 更新时间:2023-12-02 02:34:43 26 4
gpt4 key购买 nike

我还有一个问题想问那些聪明的人(这个网站太容易上瘾了)。

我正在矩阵上运行一些模拟,并且为此目的我嵌套了 for 循环。第一个创建一个向量,每次循环循环时该向量就增加 1。嵌套循环通过随机化向量、将其附加到矩阵并计算新矩阵的一些简单属性来运行模拟。 (例如,我使用的属性在模拟中不会变化,但实际上我需要模拟才能很好地了解随机向量的影响。)嵌套循环运行 100 次模拟,最终我只想要这些模拟的列平均值。

这是一些示例代码:

property<-function(mat){                       #where mat is a matrix
a=sum(mat)
b=sum(colMeans(mat))
c=mean(mat)
d=sum(rowMeans(mat))
e=nrow(mat)*ncol(mat)
answer=list(a,b,c,d,e)
return(answer)
}

x=matrix(c(1,0,1,0, 0,1,1,0, 0,0,0,1, 1,0,0,0, 1,0,0,1), byrow=T, nrow=5, ncol=4)

obj=matrix(nrow=100,ncol=5,byrow=T) #create an empty matrix to dump results into

for(i in 1:ncol(x)){ #nested for loops
a=rep(1,times=i) #repeat 1 for 1:# columns in x
b=rep(0,times=(ncol(x)-length(a))) #have the rest of the vector be 0
I.vec=append(a,b) #append these two for the I vector
for (j in 1:100){
I.vec2=sample(I.vec,replace=FALSE) #randomize I vector
temp=rbind(x,I.vec2)
prop<-property(temp)
obj[[j]]<-prop
}
write.table(colMeans(obj), 'myfile.csv', quote = FALSE, sep = ',', row.names = FALSE)
}

我遇到的问题是如何用嵌套循环的结果填充空对象矩阵。 obj 最终成为主要由 NA 组成的向量,因此很明显我没有正确分配结果。我希望每个周期都向 obj 添加一行 prop,但如果我尝试

obj[j,]<-prop

R 告诉我矩阵上的下标数量不正确。

非常感谢您的帮助!

编辑:好的,这是针对以下答案的改进代码:

property<-function(mat){                       #where mat is a matrix
a=sum(mat)
b=sum(colMeans(mat))
f=mean(mat)
d=sum(rowMeans(mat))
e=nrow(mat)*ncol(mat)
answer=c(a,b,f,d,e)
return(answer)
}

x=matrix(c(1,0,1,0, 0,1,1,0, 0,0,0,1, 1,0,0,0, 1,0,0,1), byrow=T, nrow=5, ncol=4)

obj<-data.frame(a=0,b=0,f=0,d=0,e=0) #create an empty dataframe to dump results into
obj2<-data.frame(a=0,b=0,f=0,d=0,e=0)

for(i in 1:ncol(x)){ #nested for loops
a=rep(1,times=i) #repeat 1 for 1:# columns in x
b=rep(0,times=(ncol(x)-length(a))) #have the rest of the vector be 0
I.vec=append(a,b) #append these two for the I vector
for (j in 1:100){
I.vec2=sample(I.vec,replace=FALSE) #randomize I vector
temp=rbind(x,I.vec2)
obj[j,]<-property(temp)
}
obj2[i,]<-colMeans(obj)
write.table(obj2, 'myfile.csv', quote = FALSE,
sep = ',', row.names = FALSE, col.names=F, append=T)
}

但是,这仍然有问题,因为 myfile 应该只有四行(x 的每一列各一行),但实际上有 10 行,其中一些是重复的。有什么想法吗?

最佳答案

您的property函数正在返回一个列表。如果你想将数字存储在矩阵中,你应该让它返回一个数字向量:

property <- function(mat)
{
....
c(a, b, c, d, e) # probably a good idea to rename your "c" variable
}

或者,不要将 obj 定义为矩阵,而是将其设为 data.frame (这在概念上更有意义,因为每一列代表不同的数量)。

obj <- data.frame(a=0, b=0, c=0, ...)
for(i in 1:ncol(x))
....
obj[j, ] <- property(temp)

最后,请注意,对 write.table 的调用将覆盖 myfile.csv 的内容,因此它将包含的唯一输出是最后一次迭代的结果我的。

关于r - 将 for 循环的结果分配给空矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6991434/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com