将数据框递归转换为嵌套列表,其中列表的嵌套级别等于数据框中的列数

问题描述 投票:0回答:1

我有以下数据框。

Data_Frame <- structure(list(Factor_1 = c("AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "AA", "BB", "BB", "BB", "BB", "BB", "BB", "BB", "BB", "BB", "BB", "BB", "BB", "BB", "BB", "BB", "CC", "CC", "CC", "CC", "CC", "CC", "CC", "CC", "CC", "CC", "CC", "CC", "CC", "CC", "CC", "DD", "DD", "DD", "DD", "DD", "DD", "DD", "DD", "DD", "DD", "DD", "DD", "DD", "DD", "DD"), Factor_2 = c("aa", "aa", "aa", "bb", "bb", "bb", "cc", "cc", "cc", "dd", "dd", "dd", "ee", "ee", "ee", "aa", "aa", "aa", "bb", "bb", "bb", "cc", "cc", "cc", "dd", "dd", "dd", "ee", "ee", "ee", "aa", "aa", "aa", "bb", "bb", "bb", "cc", "cc", "cc", "dd", "dd", "dd", "ee", "ee", "ee", "aa", "aa", "aa", "bb", "bb", "bb", "cc", "cc", "cc", "dd", "dd", "dd", "ee", "ee", "ee"), Factor_3 = c("xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz", "xxx", "yyy", "zzz")), class = "data.frame", row.names = c(NA, -60L))

我想编写一个递归函数,将该数据帧分割成一个嵌套列表。输出应类似于以下对象。

Split_Data <- lapply(lapply(split(Data_Frame, Data_Frame[, 1]), function (x) {
  split(x, x[, 2])
}), function (x) {
  lapply(x, function (y) {
    split(y, y[, 3])
  })
})

换句话说,数据框应该首先按第一列的值进行拆分,然后按第二列中的值进行拆分,依此类推,直到所有列都已被使用,将数据拆分为越来越小的数据数据框(列表随着每次分割而变得越来越嵌套)。

在此示例中,数据框中只有三列,但实际上,可以有任意数量的列,因此我希望递归函数能够处理任意数量的列。

谢谢!

r list function recursion
1个回答
0
投票

我不完全确定您是否需要帮助专门编写递归函数,或者您是否希望能够动态传递要分割的列数。

如果是后者,你可以简单地这样做:

library(tidyverse)

col_names <- c('Factor_1', 'Factor_2', 'Factor_3')


Data_Frame %>%
  group_by(across(all_of(!!col_names))) %>%
  group_split()
© www.soinside.com 2019 - 2024. All rights reserved.