在 R purr 中迭代读取/变异 csv 文件
Posted
技术标签:
【中文标题】在 R purr 中迭代读取/变异 csv 文件【英文标题】:iterate reading/mutating csv files in R purr 【发布时间】:2022-01-20 01:09:14 【问题描述】:我在 R 中有一个 csv 文件文件夹,需要根据文件名中的信息在列中循环、清理和创建。我正在尝试使用 purr,这就是我到目前为止所做的。
# get file names
files_names <- list.files("data/", recursive = TRUE, full.names = TRUE)
# inspect
files_names
[1] "data/BOC_All_ATMImage_(Aug 2020).txt" "data/BOC_All_ATMImage_(Aug 2021).txt" "data/BOC_All_ATMImage_(Feb 2021).txt"
[4] "data/BOC_All_ATMImage_(May 2021).txt" "data/BOC_All_ATMImage_(Nov 2020).txt" "data/BOC_All_ATMImage_(Nov 2021).txt"
# extract month/year inside brackets and convert to snakecase
# this will be used later to create column names
names_data <- files_names %>%
str_extract(., "(?<=\\().*?(?=\\))") %>%
str_to_lower() %>%
str_replace(., " ", "_")
column_names
[1] "aug_2020" "aug_2021" "feb_2021" "may_2021" "nov_2020" "nov_2021"
现在循环遍历 csv,读取每个 csv,进行一些数据清理并创建列
mc_data <-
map(files_names,
~ read_csv(.x, guess_max = 50000) %>%
janitor::clean_names() %>%
mutate(month_year = str_extract(.x, "(?<=\\().*?(?=\\))"),
date_dmy = paste0(day, "-", month_year),
date = dmy(date_dmy),
fsa = str_sub(postal_code, start = 1, end=3),
?? = 1) %>%
select(-date_dmy),
.id = "group"
)
我需要再改变一列,并且该列必须根据提取的 names_data
命名。我目前在上面的假代码中将此作为??
。 names_data
遵循与文件路径相同的顺序,因此我们的想法是在一个循环中执行并在清理后保存每个数据。
【问题讨论】:
【参考方案1】:我们可以使用胶合语法和map2
。也许:
mc_data <-
map2(files_names, column_names,
~ read_csv(.x, guess_max = 50000) %>%
janitor::clean_names() %>%
mutate(month_year = str_extract(.x, "(?<=\\().*?(?=\\))"),
date_dmy = paste0(day, "-", month_year),
date = dmy(date_dmy),
fsa = str_sub(postal_code, start = 1, end=3),
'.y' := 1) %>%
select(-date_dmy),
.id = "group"
)
【讨论】:
这很好用!我从来没有使用过map2所以非常感谢。一些相关的问题:如何将每个数据集保存在内存中并为其命名与 column_names 向量相同?以上是关于在 R purr 中迭代读取/变异 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章