У меня есть три источника данных:
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]
}
}
}
Я пытался как-то векторизовать это, но зацикливаюсь на переменной длине «мест» и «этого.об».
На практике, конечно, таблица lookup.counts немного больше (500 x 40), и у меня есть около 900 тысяч наблюдений со списками мест длиной от 1 до 39.
lapply
, и это не будет векторизовано. - person Justin   schedule 22.10.2012data.frame
не будет принимать ни столбцы типа списка, ни строки с разным количеством столбцов. - person MvG   schedule 22.10.2012tapply
или подобное, что не намного лучше, чемlapply
. - person MvG   schedule 22.10.2012data.table
. но я не думал об этом очень далеко, поэтому у меня нет ответа :) - person Justin   schedule 22.10.2012