В этом конкретном случае (в общем случае, когда все столбцы имеют одинаковый тип, хотя, если вас интересует только пропущенная статистика данных, это может быть дополнительно ослаблено), вы можете использовать гораздо более простую структуру, чем эта.
С данными, определенными так:
df <- copy_to(sc, iris, overwrite = TRUE)
gather
столбцы (ниже я предполагаю функцию, как определено в мой ответ до Соберите в sparklyr )
long <- df %>%
select(Sepal_Length, Sepal_Width) %>%
sdf_gather("key", "value", "Sepal_Length", "Sepal_Width")
, а затем группировать и агрегировать:
long %>%
group_by(key) %>%
summarise(n = n(), nmiss = sum(as.numeric(is.na(value)), na.rm=TRUE))
с результатом как:
# Source: spark<?> [?? x 3]
key n nmiss
<chr> <dbl> <dbl>
1 Sepal_Length 150 0
2 Sepal_Width 150 0
Учитывая уменьшенный размер вывода, также хорошо собирать результат после агрегирования
agg <- df %>%
select(Sepal_Length,Sepal_Width) %>%
summarize_all(funs(
n = n(),
nmiss=sum(as.numeric(is.na(.))) # MissingCount
)) %>% collect()
и примените вашу gather
- spread
логику к результату:
agg %>%
tidyr::gather(variable, value) %>%
tidyr::separate(variable, c("var", "stat"), sep = "_(?=[^_]*$)") %>%
tidyr::spread(stat, value)
# A tibble: 2 x 3
var n nmiss
<chr> <dbl> <dbl>
1 Sepal_Length 150 0
2 Sepal_Width 150 0
На самом деле последний подход должен быть превосходным с точки зрения производительности в данном конкретном случае.