在嵌套数据框中变异

时间:2018-07-13 11:59:24

标签: r dplyr purrr

我想在组内执行kmeans并向我的数据中添加有关分配观测值的聚类号和中心的信息(仍然在组内,因此对于组A和组B,聚类1并不相同)。我以为我可以pluckkmeans进行聚类分配和质心聚类,然后也许可以将两者相互结合,最后结合原始数据。要执行前者,我想在中心的数据帧中添加行号,然后按簇的数量加入。但是如何在嵌套数据框中添加行号?以下代码可以很好地工作到最后一个“嵌套” 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())))

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

1 个答案:

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