我想循环浏览九个数据集,执行计算,并输出不同的文件名。
现有代码:
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)
我想循环浏览每个数据集并应用上面的函数。更具体地说,我想给每个处理过的数据帧重新命名一些不同的名称。有办法做到这一点吗?我还应该注意,这个代码对我不起作用——有什么明显的错误吗?
感谢
首先要避免用单独的类似结构的数据帧淹没您的全局环境。相反,继续使用数据帧列表。请参阅@GregorThomas的最佳实践答案。事实上,命名列表是更好的索引。
# 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")
总体而言,您的组织和数据管理得到了增强,因为您只需要使用单个索引对象,而不需要使用许多需要ls
、mget
、get
、eval
、assign
进行动态操作的对象。