如何在lapply中引用列表字段转换数据类型?求更优方案
问题描述
我有一个dataframe列表,目标是将其中的pr_date字段转换为日期类型。示例数据如下:
vista2018 <- data.frame(pr_code="001", pr_date="28/02/2018 00:00:00") vista2019 <- data.frame(pr_code="002", pr_date="28/02/2019 00:00:00") vista2020 <- data.frame(pr_code="003", pr_date="28/02/2020 00:00:00")
我的实现方式:
vistes <- list( vista2018, vista2019, vista2020) vistes <- lapply(vistes, function(x) { x$pr_date=as.Date(x$pr_date, format="%d/%m/%Y"); return(x)} );
请问是否有更高效或更优雅的解决方案?
优化方案
1. 使用purrr包的map函数(更简洁优雅)
purrr属于tidyverse生态工具包,map函数语法更简洁,可读性更强:
library(purrr) vistes <- list(vista2018, vista2019, vista2020) vistes <- map(vistes, ~ { .x$pr_date <- as.Date(.x$pr_date, format = "%d/%m/%Y") .x })
还可以进一步简化为一行代码:
vistes <- map(vistes, ~ transform(.x, pr_date = as.Date(pr_date, format = "%d/%m/%Y")))
2. 使用data.table提升效率(大数据场景优先)
如果你的dataframe列表数据量较大,data.table的操作效率更高,且语法简洁:
library(data.table) vistes <- list(vista2018, vista2019, vista2020) vistes <- lapply(vistes, function(x) { setDT(x)[, pr_date := as.Date(pr_date, format = "%d/%m/%Y")] })
setDT会将dataframe原地转换为data.table(节省内存),直接修改目标字段即可完成转换。
3. 先合并后转换再拆分(统一处理场景适用)
若所有dataframe结构完全一致,可先合并为单个大dataframe,完成日期转换后再拆分为列表,适合批量统一操作:
library(dplyr) library(tidyr) vistes <- list(vista2018, vista2019, vista2020) # 合并为单个dataframe并添加分组标识 combined_df <- bind_rows(vistes, .id = "group") %>% mutate(pr_date = as.Date(pr_date, format = "%d/%m/%Y")) # 拆分回列表 vistes <- combined_df %>% group_split(group, .keep = FALSE)
内容的提问来源于stack exchange,提问作者Joanfer
相关产品推荐
相关产品推荐

