在嵌套数据框中变异

Mutate within nested data frame

我想在组内执行 kmeans 并在我的数据中添加关于集群编号和中心的数据信息,观察被分配到(仍然,在组内,因此集群 1 与组 A 和B组)。我认为我可以 pluckkmeans 聚类分配和质心,然后可能将这两者相互连接,最后与原始数据连接。要执行前者,我想向具有中心的数据帧添加行号,然后按簇数加入。但是如何在嵌套数据框中添加行号呢?下面的代码直到最后都运行良好,'nested' 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())))

有什么想法可以解决那种情况下的问题吗?同样重要的是,这种行为的原因是什么?

问题是 pluck() 正在返回一个矩阵。先投到一个 tibble,然后编号不同。

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 中心矩阵按簇号按行排序,主块中的答案是正确的。