我有三个数据源:
types<-c(1,3,3)
places<-list(c(1,2,3),1,c(2,3))
lookup.counts<-as.data.frame(matrix(runif(9,min=0,max=10),nrow=3,ncol=3))
assigned.places<-rep.int(0,length(types))
“类型”向量中的数字告诉我给定观察的“类型”是什么。地点列表中的向量告诉我可以在哪些地方找到观察结果(有些观察结果只在一个地方找到,而另一些则在所有地方都可以找到)。根据定义,对于每个观察,类型中有一个条目,位置中有一个列表。Lookup.counts 告诉我每个地方有多少每种类型的观察值(从另一个数据源生成)。
我想根据lookup.counts 生成的概率将每个观察随机分配到一个地方。使用 for 循环它看起来像“
for (i in 1:length(types)){
row<-types[i]
columns<-places[[i]]
this.obs<-lookup.counts[row,columns] #the counts of this type in each place
total<-sum(this.obs)
this.obs<-this.obs/total #the share of observations of this type in these places
pick<-runif(1,min=0,max=1)
#the following should really be a 'while' loop, but regardless it needs help
for(j in 1:length(this.obs[])){
if(this.obs[j] > pick){
#pick is less than this county so assign
pick<- 100 #just a way of making sure an observation doesn't get assigned twice
assigned.places[i]<-colnames(lookup.counts)[j]
}else{
#pick is greater, move to the next category
pick<- pick-this.obs[j]
}
}
}
我一直在尝试以某种方式对其进行矢量化,但我对“places”和“this.obs”的可变长度感到困惑
当然,在实践中,lookup.counts 表要大一些(500 x 40),并且我有一些 900K 的观察结果,其中位置列表的长度为 1 到 39。