【发布时间】:2021-11-16 11:37:26
【问题描述】:
我正在尝试从给定的“.dta”文件中提取一些数据,并向每个创建的数据框添加一个新列,其中包含文件名的一部分(一年)。必须这样做,因为我想做一些队列分析,因此跟踪年份列中每个观察的起源,然后操纵它来查看每个人的队列。 对于“.csv”文件,我有一些工作代码,但我想在处理实际数据时会遇到一些问题。我的代码如下:
library(data.table) #-> for fread
library(readr) #-> for map_df
library(dplyr) #-> for pipe_operator
library(stringr) #-> for str_sub
### Get desired filenames structure (e.g. 4 digits for year)
filenames <- list.files("~/R/Data", full.names = TRUE, pattern = "*.csv")
sites <- str_sub(filenames, start = -5, end = -5) #just for experimental purpose -5 to -5
### Get length of each file
file_lengths <- unlist(lapply(lapply(filenames, read_csv2), nrow))
### Repeat sites using lengths
file_names <- rep(sites,file_lengths)
###actual file-reading
map_df_fread <- function(path,
pattern = "*.csv",
sep = ";",
dec = ",",
colClasses = NULL,
select = NULL) {
list.files(path, pattern, full.names = TRUE) %>%
map_dfr(~fread(., sep = sep, dec = dec, stringsAsFactors = F,
header = T, colClasses = colClasses,
select = select)) %>%
tibble() %>% mutate(year = file_names)
}
它做了它应该做的事情,至少在小数据集上是这样。实际数据中每个变量的观测值超过 10m。由于我想处理“*.dta”文件,我想我可以用 read_dta 替换 read_csv2() 但我担心的是在这一步中 R 会读取完整的数据,我想这将花费非常多的时间。无论如何要在我的文件读取功能中包含第一步(必须执行 20 次)? 我真的很想限制所有这些计算所需的内存量。
任何帮助将不胜感激!
提前致谢
【问题讨论】:
标签: r