私は2つのデータフレームを持っています。
DF1
には、領域に割り当てられた一意のIDと、各IDに含まれる人数の数が含まれています。 (COUNT
列)。
DF2
には、地域を割り当てる必要がある人数の数が含まれます(CHANGE
列)。 データフレーム内の複数の行にランダムに値を分配する
に割り当てられた行はありがとうランダムに渡っ
DF1
に
COUNT
列に
DF2
に
CHANGE
列から余分な24人を追加して、例えばエリアAの場合には、の効率的な方法があります。
DF1 <- data.frame(matrix(0, nrow=20, ncol=3))
DF1[,1] <- 1:20
DF1[,2] <- rep(c("A","B","C","D"), each=5)
DF1[,3] <- sample(10:30,20,rep=TRUE)
colnames(DF1) <- c("ID","AREA","COUNT")
DF2 <- data.frame(matrix(0, nrow=4, ncol=2))
DF2[,1] <- c("A","B","C","D")
DF2[,2] <- c(24,-17,-1,5)
colnames(DF2) <- c("AREA","CHANGE")
編集: これは私の現在の解決方法です。しかし、私の実際のデータセットには何千もの行が含まれており、完了するまでに数時間かかります。なぜ私は同じ目標を達成するより効率的な方法の後に来たのですか?
for (i in 1:length(unique(DF2[,1]))){
DF_Area <- unique(DF1[,2])
DF1_Subset <- with(DF1, DF1[AREA == DF_Area[i],])
DF2_Row <- DF2[DF2$AREA %in% DF_Area[i],]
if(DF2_Row$CHANGE!=0){
DF1_Update <- as.data.frame(DF1_Subset$COUNT)
if(DF2_Row$CHANGE>=0){ALLOCATION_VALUE <- 1}else{ALLOCATION_VALUE <- -1}
for (GG in 1:abs(DF2_Row$CHANGE)){
DF1_Update_Row <- sample(which(DF1_Update > 0),1)
DF1_Update[DF1_Update_Row, ] <- DF1_Update[DF1_Update_Row, ] + ALLOCATION_VALUE}
DF1_Subset$COUNT <- DF1_Update[,1]
DF1$COUNT[match(DF1$ID, DF1_Subset$ID, nomatch = 0) != 0] <- DF1_Subset$COUNT[match(DF1$ID, DF1_Subset$ID, nomatch = 0)]}}
@timat質問に私の現在の解決策を追加しました。私はそれをやるより効率的な方法があるはずだと思う。 – Chris
すべての領域には常に5行/エントリがありますか?その場合、 'DF1 [、1] < - rep(1:5,4)'に変更できますか? – Aramis7d
@ Aramis7d彼らはしません。私は私の例でそれを簡略化しました。領域には行数/エントリ数が異なる – Chris