动态拆分和命名数据框

Dynamically Splitting and naming the dataframe

我有一个名为 "loan" 的数据框,其中包含客户 ID、贷款金额、贷款期限等所有信息。

有一列叫做"yq",基本上是贷款支付日期的年份和季度

    ID      yq
    1       2014 Q4
    2       2014 Q4
    3       2015 Q1
    4       2015 Q2
    5       2015 Q3  

我想根据季度和年份拆分数据框,所以自然而然地使用了以下内容:

 list_of_dataframes <- split(loan,                  
                       with(loan, yq), 
                       drop = TRUE)

但这导致我像这样对拆分数据集进行硬编码:

      loan_2014_q4 <- list_of_dataframes[[1]]

      loan_2015_q1 <- list_of_dataframes[[2]]

有没有办法更好地做到这一点,比如数据框的名称是 "loan",后跟每个行中的值。要保存的数据帧数也是动态的

基本上我是在尝试自动化这个过程,因此分割数和数据框会自动分割、命名和保存。

提前致谢

由于您要求自动化,运行 创建后 list_of_dataframes

temp <- unique(loan$yq)
for(i in 1:length(list_of_dataframes)) {
    assign(paste0("loan_",temp[i]),list_of_dataframes[[i]])
}

我最终会建议您将数据保存在 list 中(或者如果您使用 "data.table" 和 "dplyr" 这样的工具,您甚至不需要列表灵活的子集选项)。

但是,如果您真的觉得需要单独的 data.frame,请尝试以下操作:

## Assume your data.frame is called "mydf"....
temp <- split(mydf, mydf$yq, drop = TRUE)
ls()
[1] "mydf" "temp"
temp
# $`2014 Q4`
#   ID      yq
# 1  1 2014 Q4
# 2  2 2014 Q4
# 
# $`2015 Q1`
#   ID      yq
# 3  3 2015 Q1
# 
# $`2015 Q2`
#   ID      yq
# 4  4 2015 Q2
# 
# $`2015 Q3`
#   ID      yq
# 5  5 2015 Q3

现在,使用list2env将每个列表项作为其自己的对象放入全局环境中。首先修改列表的名称。

list2env(setNames(temp, sprintf("loan_%s", gsub("\s+", "_", names(temp)))), .GlobalEnv)
# <environment: R_GlobalEnv>
ls()
# [1] "loan_2014_Q4" "loan_2015_Q1" "loan_2015_Q2" "loan_2015_Q3" "mydf" "temp"
loan_2014_Q4
#   ID      yq
# 1  1 2014 Q4
# 2  2 2014 Q4