【问题标题】:How to extract into columns multiple components from a list within nested column如何从嵌套列中的列表中提取多个组件到列中
【发布时间】:2023-04-04 08:45:01
【问题描述】:

如标题所示,有没有办法使用purrrdplyr 从列表中提取多个组件? pluck 适用于单个元素,但不是少数。如下所示:

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(c('cluster', 'centers'))))

然后,我想将关于观测值分配给的聚类编号和聚类质心的信息直接添加到data。数据列中单个元素的期望输出如下所示:

structure(list(x = c(7.73117371369153, 0.0510848499834538, 4.55259998561814, 
9.89025634946302, 2.37372878007591, 1.97317335521802), y = 
c(7.59347913088277, 8.7801841692999, 9.11954281385988, 3.90361216617748, 
2.92225106153637, 0.338000932242721), cluster = c(3L, 1L, 1L, 3L, 2L, 2L), 
x_center = c(7.99236144404858, 2.53133282822091, 2.53133282822091, 
7.99236144404858, 3.79731344497379, 3.79731344497379), y_center = 
c(6.60092391962694, 8.42530809265251,8.42530809265251, 6.60092391962694, 
2.02696633155403, 2.02696633155403)), .Names = c("x", "y", "cluster", 
"x_center", "y_center"), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

    标签: r dplyr purrr


    【解决方案1】:

    我们可以使用基础 R 中的[

    my_data %>% 
      group_by(group) %>% 
      nest() %>% 
      mutate(km_cluster = map(data, ~kmeans(.x, 3) %>% `[`(c("cluster", "centers"))))
    # # A tibble: 3 x 3
    #   group data              km_cluster
    #   <fct> <list>            <list>    
    # 1 B     <tibble [25 x 2]> <list [2]>
    # 2 C     <tibble [60 x 2]> <list [2]>
    # 3 A     <tibble [15 x 2]> <list [2]>
    

    更新

    my_data2 <- my_data %>% 
      group_by(group) %>% 
      nest() %>% 
      mutate(km_cluster = map(data, ~kmeans(.x, 3))) %>%
      mutate(data = map2(data, km_cluster, ~.x %>% mutate(cluster = .y[["cluster"]])),
             data = map2(data, km_cluster, ~left_join(.x, 
                                                      .y %>%
                                                        pluck("centers") %>%
                                                        as_data_frame() %>%
                                                        rowid_to_column() %>%
                                                        rename(x_center = x, y_center = y), 
                                                      by = c("cluster" = "rowid"))))
    

    【讨论】:

    • 如果你觉得 ``[()`` 很别扭也可以使用magrittr::extract()
    • @camille 很高兴知道。感谢分享。
    • 谢谢。我怎样才能从那里把信息从km_cluster 放到data 列? (请在我附加所需的输出示例时查看我编辑的帖子)
    • 我喜欢magrittr::extract(和magrittr::inset 等),但不幸的是tidyr 有一个extract 功能很好,它做的事情完全不同,所以恕我直言,完全避免它更安全。我们可以定义select.list,但已经有了utils::select.list,这又是完全不同的,所以这并不是什么大问题。我个人坚持使用[,根本不再使用magrittr
    • @Moody_Mudskipper 感谢您分享此信息和您的经验。非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 2018-03-23
    • 2019-09-07
    • 2018-06-23
    • 2018-12-13
    • 2020-08-20
    相关资源
    最近更新 更多