do.call() 没有正确附加数据帧列表知道为什么吗?

问题描述

我正在下载大量 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列表示每一行的来源

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...