我在下面有以下代码,我想要做的是填充数据框。应该从自定义函数rX返回每一行(它返回一个包含3个数字的向量)。
我已经想出了两种方法来实现这一目标,但他们都觉得有点像解决方案,我想知道是否有人有更好的建议方式。
方法1涉及循环遍历每个迭代,将结果存储在临时变量中,然后将其放在数据框中的正确位置
第二种方法将数据绑定,但是我留下了空行,需要在之后将其删除。
n=500
ff<-c(0.2,0.3,0.5,0.25)
rX<-function(ff){
#generate data frame to hold set selections
rands<-runif(3)
s<-rep(0,3)
for(x in 1:3){
#generate probabalities from FF
probs<-cumsum(ff/sum(ff))
#select first fracture set
s[x]<-min(which(probs>=rands[x]))
#get rid of set and recalc
s[x]
ff[s[x]]<-0
}
rx<-s
}
解决方案
#way 1
df_sets<-data.frame(s1=rep(0,n),s2=rep(0,n),s3=rep(0,n))
for (i in 1:n){
a<-rX(ff)
df_sets$s1[i]<-a[1]
df_sets$s2[i]<-a[2]
df_sets$s3[i]<-a[3]
}
head(df_sets)
#way 2
df_sets<-data.frame(s1=0,s2=0,s3=0)
for (i in 1:n){
a<-rX(ff)
df_sets<-rbind(df_sets,a)
}
df_sets<-df_sets[-1,]
head(df_sets)
编辑:
该功能的关键在于创建许多实现,这些实现从(不替换)选择离散概率的预定向量。函数rX将使用静态输入,如上面的函数所示。它将通过将0和1之间的随机数与每个点的累计百分比进行比较来选择一个数据点。然后它将删除此点重新计算概率函数并重新比较。