Я хочу выбрать n строк из каждого из классов моего Spark DataFrame в sparklyr
.
Я понимаю, что для этого нельзя использовать функцию dplyr::sample_n
( Is sample_n действительно случайная выборка при использовании с sparklyr? ), поэтому я использовал функцию sparklyr::sdf_sample()
. Проблема в том, что я не могу выполнить выборку по группе, то есть получить 10 наблюдений от каждого класса, я могу указать только долю всего набора данных для выборки.
У меня есть обходной путь для использования sdf_sample()
в каждая группа индивидуально в al oop, но так как функция не возвращает точный размер выборки, это все еще не идеально.
R код для обхода проблемы:
library(sparklyr)
library(dplyr)
sc <- spark_connect(master = "local", version = "2.3")
# copy iris to our spark cluster
iris_tbl <- copy_to(sc, iris, overwrite = TRUE)
# get class counts
class_counts <- iris_tbl %>% count(Species) %>%
collect()
# Species n
# <chr> <dbl>
#1 versicolor 50
#2 virginica 50
#3 setosa 50
# we want to sample n = 10 points from each class
n <- 10
sampled_iris <- data.frame(stringsAsFactors = F)
for( i in seq_along(class_counts$Species)){
my_frac <- n / class_counts[[i, 'n']]
my_class <- class_counts[[i, 'Species']]
tmp <- iris_tbl %>%
filter(Species == my_class) %>%
sdf_sample(fraction = my_frac) %>%
collect()
sampled_iris <- bind_rows(sampled_iris, tmp)
}
Мы не я получаю ровно 10 образцов из каждого класса:
# new counts
sampled_iris %>% count(Species)
#Species n
# <chr> <int>
#1 setosa 7
#2 versicolor 9
#3 virginica 6
Мне интересно, есть ли лучший способ получить сбалансированную выборку по группам, используя sparklyr? Или даже используя sql запрос, который я могу передать непосредственно в кластер, используя DBI::dbGetQuery()
?