Сопоставить определенные столбцы с функцией, которая принимает два аргумента - PullRequest
0 голосов
/ 21 ноября 2018

После запуска 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

Ценю ваши ответы!

1 Ответ

0 голосов
/ 21 ноября 2018

Мы можем использовать group_by_at вместо group_by_ (устарело).Здесь нам нужно перебрать имена столбцов «a» вместо столбцов «iris»

library(tidyverse)
map(colnames(a), ~ cluster_result2(iris, .x))

Или, не используя ~, указать параметр «x» как «iris»

map(colnames(a), cluster_result2, x = iris)
#[[1]]
# A tibble: 2 x 3
#  result_2_cl  size mean_spl
#        <int> <int>    <dbl>
#1           1    50     5.01
#2           2   100     6.26

#[[2]]
# A tibble: 3 x 3
#  result_3_cl  size mean_spl
#        <int> <int>    <dbl>
#1           1    47     6.78
#2           2    53     5.80
#3           3    50     5.01

#[[3]]
# A tibble: 4 x 3
#  result_4_cl  size mean_spl
#        <int> <int>    <dbl>
#1           1    50     6.14
#2           2    22     5.50
#3           3    29     7.00
#4           4    49     5.02

#[[4]]
# A tibble: 5 x 3
#  result_5_cl  size mean_spl
#        <int> <int>    <dbl>
#1           1    16     5.32
#2           2    29     7.00
#3           3    23     5.55
#4           4    34     4.86
#5           5    48     6.16

-проверка с выходом функции, индивидуально применяемой к столбцам

cluster_result2(iris, colnames(a)[4])
# A tibble: 5 x 3
#  result_5_cl  size mean_spl
#        <int> <int>    <dbl>
#1           1    16     5.32
#2           2    29     7.00
#3           3    23     5.55
#4           4    34     4.86
#5           5    48     6.16

ПРИМЕЧАНИЕ. Выходные данные будут немного отличаться из-за случайности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...