У меня есть два кадра данных.
DF1
содержит уникальные идентификаторы, присвоенные области, и количество людей в каждом идентификаторе. (колонка COUNT
).
DF2
содержит сколько еще или менее людей нужно назначить область (столбец CHANGE
).Случайное распределение значений по нескольким строкам в кадре данных
Есть ли эффективный способ, в случае зону А, например, добавление дополнительных 24 людей из CHANGE
колонны в DF2
к COUNT
колонку в DF1
случайным образом через строку, назначенная зоны А.
Спасибо.
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")
EDIT: Это мое текущее решение. Однако мой фактический набор данных содержит тысячи строк и занимает несколько часов. Поэтому почему я добился более эффективного пути достижения той же цели.
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