问题描述
我正在下载大量 PiT 数据集,并尝试将它们自动组合成单个时间序列数据帧 (master_df)
temp <- tempfile()
testing <- download.file("https://data.sa.gov.au/data/dataset/3ba1c4dd-e52f-4c28-858a-21284c3ee458/resource/c78fc6da-baa4-47cc-b4df-a97f452bbf9a/download/ken01_p.zip",temp)
filenames<-unzip(temp,list=TRUE)[,1]
#only want csvs
filenames<-filenames[str_detect(filenames,".csv")]
dfnames = list()
for (i in 1:length(filenames)){
conn<-unz(temp,filenames[i])
#name files in loop
filename <- sprintf("df_%s",filenames[i] %>%
str_replace("KEN01_p/KEN01p_1hr","") %>%
str_replace(".csv",""))
# list of filenames
dfnames[[i]] <- filename
assign(filename,read.csv(conn))
}
master_df <- do.call(rbind,dfnames)
unlink(temp)
class(master_df)
class(df_201912)
类(master_df) [1]“矩阵” 班级(df_201912) [1]“数据框”
循环成功读取所有数据集,并将它们重命名为 df_yyyymm,但 do.call rbind 只是生成数据名称列表。
我做错了什么?
谢谢!!
解决方法
无需使用 assign
,因为它将所有数据帧写入不需要的全局环境。您可以使用 lapply
将所有数据帧合并为一个,而且某些数据帧具有不同的列名,因此最好使用 map_df
将它们合并为一个数据帧,方法是附加 {{1} } 值。
NA
,
代码中的问题是使用文件名而不是值分配 list
元素
for (i in 1:length(filenames)){
conn<-unz(temp,filenames[i])
#name files in loop
filename <- sprintf("df_%s",filenames[i] %>%
str_replace("KEN01_p/KEN01p_1hr","") %>%
str_replace(".csv",""))
# list of filenames
dfnames[[i]] <- read.csv(conn) ###
#assign(filename,read.csv(conn))
}
另外,有一些list
元素的名称不同,因此rbind
不起作用,我们可以使用rbindlist
中的data.table
library(data.table)
out <- rbindlist(dfnames,fill = TRUE) dim(out)
[1] 44544 6
,
这是我下载一个 zip 文件、解压并将所有 csv 文件读入一个大数据集的方法:
temp <- tempfile()
testing <- download.file(
"https://data.sa.gov.au/data/dataset/3ba1c4dd-e52f-4c28-858a-21284c3ee458/resource/c78fc6da-baa4-47cc-b4df-a97f452bbf9a/download/ken01_p.zip",temp)
filenames <- unzip(temp,list = FALSE)
library(data.table)
library(magrittr) # piping used to improve readability
master_df <- lapply(filenames,fread) %>%
set_names(filenames %>% basename() %>% stringr::str_remove_all("^KEN01p_1hr|\\.csv$")) %>%
rbindlist(fill = TRUE,idcol = TRUE)
master_df
.id Date/Time PM10 TEOM ug/m3 PM2.5 TEOM ug/m3 Temperature Deg C Barometric Pressure atm PM10 BAM ug/m3
1: 201501 1/01/2015 1:00 18.2 NA 16.8 0.986 NA
2: 201501 1/01/2015 2:00 20.3 NA 15.9 0.985 NA
3: 201501 1/01/2015 3:00 27.9 NA 15.1 0.985 NA
4: 201501 1/01/2015 4:00 23.6 NA 16.9 0.984 NA
5: 201501 1/01/2015 5:00 15.8 NA 19.7 0.984 NA
---
44540: 201912 31/12/2019 20:00 NA NA 19.4 NA 14
44541: 201912 31/12/2019 21:00 NA NA 18.0 NA 14
44542: 201912 31/12/2019 22:00 NA NA 16.7 NA 19
44543: 201912 31/12/2019 23:00 NA NA 15.8 NA 11
44544: 201912 1/01/2020 0:00 NA NA 15.3 NA 12
请注意,我在
中更改了list
参数
filenames <- unzip(temp,list = FALSE)
到FALSE
。这会将 zip 文件解压到名为 KEN01_p
的子目录中。解压后,该子目录包含 61 个 csv 文件,总共 1.5 MB。
还要注意.id
中的master_df
列表示每一行的来源