递归将Data Frame转换为嵌套列表:嵌套层级等于列数
递归拆分任意列数的数据框为嵌套列表(Base R实现)
原始数据框
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))
需求说明
需要实现一个递归函数,将数据框按列的顺序依次拆分:
- 先按第一列的取值拆分数据框
- 对拆分后的每个子数据框,再按第二列的取值拆分
- 重复上述步骤,直到所有列都用于拆分
- 最终生成的嵌套列表层级数与数据框的列数一致,要求支持任意列数的输入,优先使用Base R实现。
示例手动实现的嵌套拆分结果如下:
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]) }) })
递归解决方案
以下是Base R的递归函数实现:
recursive_split <- function(df, col_idx = 1) { # 终止条件:当列索引超过数据框总列数时,返回原数据框 if (col_idx > ncol(df)) { return(df) } # 按当前列拆分数据框 split_list <- split(df, df[, col_idx]) # 对每个拆分后的子数据框,递归调用函数处理下一列 lapply(split_list, function(sub_df) recursive_split(sub_df, col_idx + 1)) }
使用方法
调用函数并传入目标数据框即可:
Split_Data_Recursive <- recursive_split(Data_Frame)
验证结果
可以通过以下代码验证递归实现的结果与手动嵌套实现的结果是否一致:
identical(Split_Data, Split_Data_Recursive) # 输出:TRUE
函数说明
- 函数接受两个参数:
df为待拆分的数据框,col_idx为当前要拆分的列索引(默认从第一列开始) - 终止条件:当
col_idx超过数据框的总列数时,直接返回当前的子数据框 - 递归步骤:先按当前列拆分数据框,再对每个子数据框递归调用函数,处理下一列,最终生成嵌套层级与列数匹配的列表
内容的提问来源于stack exchange,提问作者David Moore
相关产品推荐
相关产品推荐

