根据列位置创建组

Creating Groups based on Column Position

下午好!

我认为这是一个非常简单的问题,但我想我漏掉了几个步骤。想根据列位置创建组。

正在使用数据框/tibble;长 33 行,宽 66 列。然而,每个 6 列的序列,实际上应该分成它自己的子数据框/tibble。

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

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

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

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

最终希望 mtcars 数据框是...

还考虑了 pivot_longer...

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

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

希望你们中的一个能帮助我解决这个问题!将使某些工作任务变得更加容易。

PS - 如果您可以将工作流程保持在以 tidyverse 为中心的代码,那就更好了:)

你可以试试这个。它根据您想要的列数(在您的示例中为 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()
    )

编辑

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

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)