R случайным образом выбирает строки, пока не встретится переменная сумма - PullRequest
1 голос
/ 25 февраля 2020

Я заинтересован в сравнении некоторых значений между патчами разного размера, но хочу случайным образом выбирать маленькие патчи, пока их площадь не будет равна площади случайно выбранного большого патча. Затем я сравнил бы уникальное количество видов между этим набором маленьких пятен и единственным большим пятном.

Например,

>df
ID     Type        Area        Species1     Species2
1      Big          50            1            1
2      Big          100           1            0
3      Small        25            0            1
4      Small        50            1            1
5      Small        25            1            1

Затем я бы хотел случайным образом выбирать небольшие патчи, пока их суммы в области не будут совпадать со случайно выбранным большим патчем. Затем я хотел бы сравнить уникальное количество видов между этим отбором и случайно выбранным большим пятном одинакового размера. Например,

Если выбран патч 1 и случайный селектор может выбрать либо патч 4, либо 3 + 5. Тогда сравнение будет между уникальным счетчиком Patch1 = 2, уникальным счетчиком Patch4 = 2 или уникальным счетчиком 3 + 5 = 2.

Надеюсь, это имеет смысл. Если есть какие-либо вопросы, я был бы рад ответить / обновить это. Спасибо за вашу помощь.

1 Ответ

2 голосов
/ 25 февраля 2020
Bigs<-data.frame(Type="Bigs",    Area=rbinom(3,100,rbeta(10,1,1)),    Species1=rbinom(3,1,.5), Species2=rbinom(3,1,.5), stringsAsFactors = F);
Smalls<-data.frame(Type="Smalls",Area=rbinom(1000,20,rbeta(1000,1,1)),Species1=rbinom(20,1,.5),Species2=rbinom(20,1,.5),stringsAsFactors = F);

L<-lapply(1:nrow(Bigs),
       function(i){
         samplesmalls<-c();
         x=Bigs$Area[i];
         while(x>0&x>min(Smalls$Area)){
           drawsmall<-sample((1:nrow(Smalls))[Smalls$Area<=x],1)
           samplesmalls<-c(samplesmalls,drawsmall)
           x<-x-Smalls$Area[drawsmall]
           }
         samplesmalls
       })

do.call(rbind,lapply(1:length(L),function(i){cbind(toreplace=i,Smalls[L[[i]],])}))

   toreplace   Type Area Species1 Species2
251         1 Smalls   19        1        1
502         1 Smalls    9        0        1
616         1 Smalls   12        0        1
163         1 Smalls   11        0        1
81          1 Smalls    2        1        0
609         1 Smalls    8        1        0
853         1 Smalls    0        1        0
702         1 Smalls    3        0        1
451         2 Smalls    9        1        1
432         2 Smalls    5        0        0
643         2 Smalls    1        0        1
391         2 Smalls    0        1        1
259         2 Smalls    0        1        1
905         2 Smalls    1        1        0
35          3 Smalls   10        1        0
727         3 Smalls   17        1        1
640         3 Smalls    8        1        0
357         3 Smalls    0        1        0
900         3 Smalls    4        1        0
217         3 Smalls    3        1        0
771         3 Smalls    4        1        1
647         3 Smalls    1        1        1
351         3 Smalls    5        1        1
412         3 Smalls    6        0        0
639         3 Smalls    2        1        1
183         3 Smalls    0        0        1
962         3 Smalls    0        0        1
567         3 Smalls    0        1        1
212         3 Smalls    1        0        0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...