【问题标题】:R Apply Function for Formatting Many DatasetsR应用函数格式化许多数据集
【发布时间】:2021-04-01 13:20:18
【问题描述】:

我想遍历九个数据集,执行计算,并输出不同的文件名。

现有代码:

    list <- c(corporate_service, finance, its, law, market_services, operations, president, member_services, System_Planning)

    Calc <- function(list){
  
         list %>%  filter(Total_Flag == 1) %>%
                   select(Element, Amount, Total)

     }
  
     lapply(list, Calc)

我想遍历每个数据集并应用上面的函数。更具体地说,我想将每个已处理的数据框重新命名为不同的名称。有没有办法做到这一点?我还应该注意,这段代码对我不起作用 - 有什么明显的错误吗?

谢谢

【问题讨论】:

  • corporate_servicefinance等变量是data.frames吗?如果是这样,您应该只使用list() 而不是c() 将它们放入一个集合中。 wage_allocationCalc 应该是相同的功能吗?如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。
  • corporate_service 和 finance 是 data.frame 的名称。哎呀,是的,它们是相同的功能。我编辑了它。
  • 应该是list &lt;- list(corporate_service, finance,...) 而不是list &lt;- c(corporate_service, finance, ...) 那么转换应该可以正常工作。
  • 注意,最好不要使用函数名,例如list 作为变量名,因为它令人困惑。
  • 请注意,最好不要保存单独类似结构的数据帧,而是继续使用此类元素的list。看到这个canonical answer

标签: r loops apply


【解决方案1】:

首先避免使用独立、类似结构的数据框来淹没您的全球环境。而是继续使用数据框列表。请参阅@GregorThomas 的最佳实践answer 了解原因。事实上,命名列表更适合更好的索引。

# DEFINE A NAMED LIST OF DATA FRAMES
df_list <- list(corporate_service = corporate_service, 
                finance = finance, 
                its = its, 
                law = law, 
                market_services = market_services, 
                operations = operations, 
                president = president, 
                member_services = member_services, 
                system_planning = System_Planning)

# REMOVE ORIGINALS FROM GLOBAL ENVIRONMENT
rm(corporate_service, finance, its, law, market_services, 
   operations, president, member_services, System_Planning)

# REVIEW STRUCTURE
str(df_list)

然后定义一个方法来与单个数据框(不是list)及其列表名称进行交互。然后迭代调用:

Calc <- function(df, nm) {
           df <- select(filter(df, Total_Flag == 1), Element, Amount, Total)       

           write.csv(df, file.path("path", "to", "my", "destination", paste(nm, ".csv")))
           return(df)           
        }
 
# ASSIGN TO A NEW LIST
new_df_list <- mapply(Calc, df_list, names(df_list), SIMPLIFY=FALSE)
new_df_list <- Map(Calc, df_list, names(df_list))    # EQUIVALENT WRAPPER TO ABOVE

需要明确的是,如果将数据框存储在更大的容器中,则不会丢失数据框的功能。

head(new_df_list$corporate_service)
tail(new_df_list$finance)
summary(new_df_list$its)

这样的容器甚至有助于序列化相同的操作:

lapply(new_df_list, summary)

甚至将所有数据框元素与相应列表名称的列连接在一起:

final_df <- dplyr::bind_rows(new_df_list, .id="division")

总体而言,您的组织和数据管理得到了增强,因为您只需要使用一个单个的索引对象,而不是很多需要lsmgetgeteval , assign 用于动态操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多