После запуска k-means()
при использовании различных чисел k = [2,3,4,5]
в наборе данных iris
с использованием функции map()
я бы хотел интерпретировать результаты для разных k
с помощью предопределенной функции.
Ниже моя попытка:
library(dplyr)
library(purrr)
cluster_assignment <- map(2:5, function(k){
result <- kmeans((x = iris[-5] %>%
scale()),
centers = k)
# # return results to a list
x <- list(result$cluster,
result$tot.withinss,
result$centers,
result$size)
})
# assign cluster results back to the iris dataset
a <- map_dfc(cluster_assignment, 1)
colnames(a) <- paste0("result_", 2:5, "_cl")
iris <- bind_cols(iris, a)
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species result_2_cl result_3_cl result_4_cl result_5_cl
1 5.1 3.5 1.4 0.2 setosa 2 2 3 3
2 4.9 3.0 1.4 0.2 setosa 2 1 3 2
3 4.7 3.2 1.3 0.2 setosa 2 1 3 2
4 4.6 3.1 1.5 0.2 setosa 2 1 3 2
5 5.0 3.6 1.4 0.2 setosa 2 2 3 3
6 5.4 3.9 1.7 0.4 setosa 2 2 3 5
Теперь я бы применил предопределенную функцию cluster_result2
к вновь назначенным столбцам, например "result_2_cl", "result_3_cl", "result_4_cl", "result_5_cl"
# predefined function
cluster_result2 <- function(x, ...){
x %>%
group_by_(...) %>%
summarise(size = n(),
mean_spl = mean(Sepal.Length))
}
# tried this method, but did not get the expected output
map(iris[, colnames(a)], ~ cluster_result2(iris, .x))
Как мне добитьсяэто с использованием подхода tidyverse
?Я нашел очень похожий подход здесь , но не смог получить ожидаемый результат.
Ожидаемый результат будет аналогичен приведенному ниже, за исключением того, что он хранится во вложенном списке / dataframe:
> cluster_result2(iris, colnames(a)[1])
# A tibble: 2 x 3
result_2_cl size mean_spl
<int> <int> <dbl>
1 1 100 6.26
2 2 50 5.01
> cluster_result2(iris, colnames(a)[2])
# A tibble: 3 x 3
result_3_cl size mean_spl
<int> <int> <dbl>
1 1 21 4.75
2 2 33 5.17
3 3 96 6.31
> cluster_result2(iris, colnames(a)[3])
# A tibble: 4 x 3
result_4_cl size mean_spl
<int> <int> <dbl>
1 1 29 7.00
2 2 50 6.14
3 3 49 5.02
4 4 22 5.50
> cluster_result2(iris, colnames(a)[4])
# A tibble: 5 x 3
result_5_cl size mean_spl
<int> <int> <dbl>
1 1 47 6.78
2 2 17 4.69
3 3 26 5.07
4 4 53 5.80
5 5 7 5.53
Ценю ваши ответы!