我想在组内执行kmeans
并向我的数据中添加有关分配观测值的聚类号和中心的信息(仍然在组内,因此对于组A和组B,聚类1并不相同)。我以为我可以pluck
对kmeans
进行聚类分配和质心聚类,然后也许可以将两者相互结合,最后结合原始数据。要执行前者,我想在中心的数据帧中添加行号,然后按簇的数量加入。但是如何在嵌套数据框中添加行号?以下代码可以很好地工作到最后一个“嵌套” mutate
。
my_data <- data.frame(group = c(sample(c('A', 'B', 'C'), 20, replace = TRUE)), x = runif(100, 0, 10), y = runif(100, 0, 10))
my_data %>%
group_by(group) %>%
nest() %>%
mutate(km_cluster = map(data, ~kmeans(.x, 3) %>% pluck('cluster')),
km_centers = map(data, ~kmeans(.x, 3) %>% pluck('centers') %>% mutate(cluster = row_number())))
@ Luke.sonnet提供的答案与map
很好,但有趣的是与map2
无关,请参见下文:
my_data %>%
group_by(group) %>%
nest() %>%
mutate(number = sample(3:7, 3)) %>%
mutate(km_cluster = map2(data, number, ~kmeans(.x, .y) %>% pluck('cluster')),
km_centers = map2(data, number, ~kmeans(.x, .y) %>% pluck('centers') %>% as_tibble() %>% mutate(cluster = row_number())))
有什么想法可以解决这种情况吗?同样重要的是,这种行为的原因是什么?
答案 0 :(得分:1)
问题是pluck()
返回一个矩阵。首先投放小标题,然后以不同的方式编号。
library(tidyverse)
my_data <- data.frame(group = c(sample(c('A', 'B', 'C'), 20, replace = TRUE)), x = runif(100, 0, 10), y = runif(100, 0, 10))
my_data %>%
group_by(group) %>%
nest() %>%
mutate(number = sample(3:7, 3)) %>%
mutate(km_cluster = map2(data, number, ~kmeans(.x, .y) %>% pluck('cluster')),
km_centers = map2(data, number, ~kmeans(.x, .y) %>% pluck('centers') %>% as_tibble() %>% mutate(cluster = seq_len(nrow(.)))))
请注意,您也可以执行mutate(cluster = row_number(x))))
,这会提供不同的数字(请注意,仅使用row_number()
会使用父df中的行)。我认为在kmeans
的情况下,中心矩阵按簇号按行顺序排列,表示主块中的答案是正确的。