【问题标题】:Mutate within nested data frame在嵌套数据框中变异
【发布时间】:2018-07-13 11:59:24
【问题描述】:

我想在组内执行kmeans 并向我的数据中添加关于观察被分配到的集群编号和中心的信息(仍然在组内,因此集群 1 对于组 A 和组 B 不同)。我认为我可以 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())))

任何想法如何解决这种情况下的问题?同样重要的是,这种行为的原因是什么?

【问题讨论】:

    标签: r dplyr purrr


    【解决方案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,中心矩阵按簇数逐行排序,因此主块中的答案是正确的。

    【讨论】:

    • 谢谢。与map 和每个组中相同数量的集群一起使用效果很好,但不能概括为不同数量的集群和map2 使用。我已经编辑了我的帖子。
    • 已编辑以适应此问题。原始解决方案仅适用于 bc n clusters = n groups。
    猜你喜欢
    • 1970-01-01
    • 2019-03-16
    • 2019-05-21
    • 1970-01-01
    • 2016-11-20
    • 2019-07-15
    • 2019-05-02
    • 1970-01-01
    相关资源
    最近更新 更多