【问题标题】:Creating Groups based on Column Position根据列位置创建组
【发布时间】:2021-12-28 19:58:02
【问题描述】:

下午好!

我认为这是一个非常直截了当的问题,但我认为我缺少几个步骤。想根据列位置创建组。

正在使用数据框/小标题; 33 行长,66 列宽。然而,每一个 6 列的序列,都应该真正分离到它自己的子数据框/小标题中。

数字列的顺序对于数据框是任意的。下面是 mtcars 的尝试,我试图将每 2 列分组到它自己的子数据框中。

mtcars %>% 
  tibble() %>% 
  group_by(across(seq(1,2, length.out = 11))) %>% 
  nest()

但是,该方法会产生错误。类似的情况也适用于仅在 nest() 中工作。

使用 mtcars,希望使用每 3 列的序列或其他数字创建组。

最终希望 mtcars 数据框成为...

  • 1:3 列成为第 1 组,
  • 第 4:6 列成为第 2 组,
  • 列 7:9 成为第 3 组等...同时保留每列中的行信息。

还考虑了带有 pivot_longer 的东西...

mtcars %>% 
  tibble() %>% 
  pivot_longer(cols = seq(1,3, by = 1))

...但这并没有生成定义的组,或者继续沿数据框的所有列排序。

希望你们能帮我解决这个问题!会使某些工作任务更容易。

PS - 如果您可以将工作流程保持为以 tidyverse 为中心的代码,那将是一个加分项:)

【问题讨论】:

  • “组”是什么意思?一个单独的数据框列?这些列的名称应该是什么?
  • “组”是指一个数据框列表,每 3 列是一个数据框。名字对我来说并不重要,第 1 组或仅第 1 组都可以。下面提供的解决方案对我来说效果很好,虽然我真的认为它需要更少的步骤。

标签: r tidyverse tidyr


【解决方案1】:

你可以试试这个。它根据您想要的列数(在您的示例中为 3)将数据框拆分为数据框列表:

library(tidyverse)

list_of_dataframes <- mtcars %>%
  tibble() %>%
  mutate(row = row_number()) %>%
  pivot_longer(-row) %>%
  group_by(row) %>%
  mutate(group = ceiling(row_number()/ 3)) %>%
  ungroup() %>%
  group_split(group) %>%
  map(
    ~select(.x, row, name, value) %>%
      pivot_wider()
    )

编辑

在这里,根据提问者的 cmets,我们将避免旋转数据。相反,我们将组映射到数据帧中。

list_of_dataframes <- map(seq(1, ncol(mtcars), by = 3),
     ~mtcars %>%
       as_tibble() %>%
       select(all_of(.x:min(c(.x+2, ncol(mtcars))))))

然后我们可以将其包装在一个函数中,使其更易于使用和更改组大小和数据框:


group_split_cols <- function(.data, ncols_per_group){
  map(seq(1, ncol(.data), by = ncols_per_group),
     ~.data %>%
       as_tibble() %>%
       select(all_of(.x:min(c(.x+ncols_per_group-1, ncol(.data))))))
}


list_of_dataframes <- group_split_cols(.data = mtcars, ncols_per_group = 3)

【讨论】:

  • 这是一个聪明的解决方案!很确定我可以将该方法应用于更大的数据集。有点惊讶它花了更长的时间……真的认为这个过程可以在 select() 或 group_by() %>% nest() 过程中完成。不管怎样,谢谢!
  • @JamesCrumpler 我们绝对可以做到这一点。我只需要再努力一点。查看我的答案的更新。
猜你喜欢
  • 1970-01-01
  • 2017-06-24
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
相关资源
最近更新 更多