На мой взгляд, вы не используете sample_n
правильно.Функция group_size
может помочь вам определить размер группы.Предполагая, что все группы имеют одинаковый размер, вы можете заменить свой оператор выбора в функции, как показано ниже.
Позволяет.Сначала продемонстрируйте, как будет работать этот подвыбор.OP может использовать его как часть функции после проверки.
Использование min(group_size(group_by(.,subgroup)))-1
обеспечит выборку 1
меньше группы с наименьшим количеством строк.
library(tidyverse)
x %>% # this is the beginning of the sample part
group_by(subgroup) %>% # This will ensure that equal selection from each group
sample_n(.,min(group_size(group_by(.,subgroup)))-1, replace = FALSE)
#Result - 3 from each subgroup has been selected.
# # A tibble: 12 x 3
# # Groups: subgroup [4]
# x.cord y.cord subgroup
# <int> <int> <int>
# 1 1 1 1
# 2 3 5 1
# 3 2 1 1
# 4 2 -3 2
# 5 3 -1 2
# 6 1 -3 2
# 7 -4 -1 3
# 8 -2 -1 3
# 9 -5 -5 3
# 10 -4 3 4
# 11 -2 5 4
# 12 -3 4 4
Теперь, так как проверка была выполнена выше, давайте изменим функцию.
Примечание: Функция не проверена.Запросите OP для тестирования с реальными данными.
# modified function should be as
sub.df<- function(x){
library(tidyverse)
while(nrow(x) > 24) {
x.1 <- x %>% # this is the beginning of the sample part
group_by(spiral) %>%
sample_n(.,min(group_size(group_by(.,spiral)))-1, replace = FALSE)
ks <- ks.test(dist(x[,c(1,2)]), unif.null) #this part is for evaluating the exclusions
ks.1 <- ks.test(dist(x.1[,c(1,2)]), unif.null)
if(ks.1$statistic > ks$statistic) {x <- x.1} else {x <- x}
}
x
}
Данные:
x <- read.table(text =
"x.cord y.cord subgroup
1 1 1
1 4 1
3 5 1
2 1 1
2 -3 2
3 -1 2
3 -2 2
1 -3 2
-2 -2 3
-4 -1 3
-5 -5 3
-2 -1 3
-3 4 4
-1 1 4
-2 5 4
-4 3 4",
header = TRUE)