返回不同長度矢量我有三個來源:高效的功能,從查找表
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]
}
}
}
我一直試圖以某種方式矢量化這一點,但我越來越掛了的‘地方’的可變長度和‘this.obs’
在實踐中當然,lookup.counts表是相當大一點的(500 x 40),我有一些長度爲1到長度爲39的位置列表的900K觀察值。
一個好第一步是將所有這些數據放在一個對象中。我認爲你可以使用數據。爲每個觀察記錄一個條目。但從描述中很難說清楚。你也可以使用一個嵌套的命名列表,但你會去'lapply',而不是「矢量化」。 – Justin
@Justin,'data.frame'將不接受列表類型的列,也不接受列數不同的行。 – MvG
@MvG是的,但我會建議爲列表製作多行(例如,長對寬數據) – Justin