我有以下数据框。
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])
})
})
换句话说,数据框应该首先按第一列的值进行拆分,然后按第二列中的值进行拆分,依此类推,直到所有列都已被使用,将数据拆分为越来越小的数据数据框(列表随着每次分割而变得越来越嵌套)。
在此示例中,数据框中只有三列,但实际上,可以有任意数量的列,因此我希望递归函数能够处理任意数量的列。
谢谢!
我不完全确定您是否需要帮助专门编写递归函数,或者您是否希望能够动态传递要分割的列数。
如果是后者,你可以简单地这样做:
library(tidyverse)
col_names <- c('Factor_1', 'Factor_2', 'Factor_3')
Data_Frame %>%
group_by(across(all_of(!!col_names))) %>%
group_split()