根据列位置创建组
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 数据框是...
- 列 1:3 为第 1 组,
- 列 4:6 为第 2 组,
- 列 7:9 为第 3 组,等等...同时保留每列中行的信息。
还考虑了 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)
下午好!
我认为这是一个非常简单的问题,但我想我漏掉了几个步骤。想根据列位置创建组。
正在使用数据框/tibble;长 33 行,宽 66 列。然而,每个 6 列的序列,实际上应该分成它自己的子数据框/tibble。
数字列的顺序对于数据框是任意的。下面是对 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)将数据帧拆分为数据帧列表:
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)