动态拆分和命名数据框

时间:2015-11-23 06:19:22

标签: r dataframe subset

我有一个名为“贷款”的数据框,其中包含客户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”,后面是每行的值。此外,要保存的数据帧数量是动态的

基本上我正在尝试自动化该过程,因此分割和数据框的数量会自动分割,命名和保存。

提前致谢

2 个答案:

答案 0 :(得分:2)

由于您要求自动执行,请在创建passenger stop;

后运行以下命令
list_of_dataframes

答案 1 :(得分:2)

我最终会建议您将数据保存在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