R 随机 select 行,直到满足不同的总和
R randomly select rows until varying sum is met
我有兴趣比较不同大小的补丁之间的某些值,但想随机 select 小补丁,直到它们的面积等于随机 selected 大补丁的面积。然后我会比较这个 selection 小块和单个大块之间的独特物种数。
例如
>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
然后我想随机 select 小补丁,直到它们的面积总和等于随机选择的大补丁。然后我想比较这个 selection 和随机选择的大小相等的大块之间的物种的独特数量。例如
如果选择补丁 1 并且随机 select 或者可以 select 补丁 4 或 3+5。然后将在 Unique Count Patch1 =2、Unique Count Patch4 =2 或 Unique Count 3+5= 2 之间进行比较。
我希望这是有道理的。如果有任何问题,我很乐意reply/update。
感谢您的帮助。
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
我有兴趣比较不同大小的补丁之间的某些值,但想随机 select 小补丁,直到它们的面积等于随机 selected 大补丁的面积。然后我会比较这个 selection 小块和单个大块之间的独特物种数。
例如
>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
然后我想随机 select 小补丁,直到它们的面积总和等于随机选择的大补丁。然后我想比较这个 selection 和随机选择的大小相等的大块之间的物种的独特数量。例如
如果选择补丁 1 并且随机 select 或者可以 select 补丁 4 或 3+5。然后将在 Unique Count Patch1 =2、Unique Count Patch4 =2 或 Unique Count 3+5= 2 之间进行比较。
我希望这是有道理的。如果有任何问题,我很乐意reply/update。 感谢您的帮助。
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