【问题标题】:creating date variable from file names in R从R中的文件名创建日期变量
【发布时间】:2020-07-18 13:11:55
【问题描述】:

我需要一些帮助,在 R 中创建一个数据集,其中每个观测值都包含纬度、经度和日期。现在,我有一个按纬度/经度网格划分的大约 2,000 个文件的列表,每个文件都包含一个日期的观察结果。最终,我需要做的是将所有这些文件合并到一个文件中,其中每个观察值都包含一个从文件名中提取的日期变量。

例如,一个文件名为“MERRA2_400.tavg1_2d_flx_Nx.20120217.SUB.nc”。我希望该文件中的所有观察结果都包含 2012 年 2 月 17 日的日期变量。

那个“nc”扩展描述了一个netCDF文件,可以读入R如下:

library(RNetCDF)
setwd("~/Desktop/Thesis Data")
p1a<-"MERRA2_300.tavg1_2d_flx_Nx.20050101.SUB.nc"
pid<-open.nc(p1a)
dat<-read.nc(pid)

我知道ldply 命令对于从文件名中提取和指定新变量很有用。但我需要创建一个循环来组合上面“论文数据”文件夹中的所有文件(设置为我的 wd),并在此过程中为它们提供日期变量。

我一直在尝试使用两个单独的循环。第一个循环逐个上传文件,根据文件名创建一个日期变量,然后将它们重新保存到一个新文件夹中。第二个循环连接该新文件夹中的所有文件。这种策略我运气不佳。

view[dat]

正如您希望在这张描述上面上传的数据文件的图片中看到的那样,每个文件都包含一个时间变量,但该时间变量在每个文件中都有一个观察值,即 690。所以我可以用文件名中的日期替换那个变量,或者我可以创建一个新变量——任何一个都可以。

任何帮助将不胜感激!

【问题讨论】:

    标签: r loops date time-series netcdf


    【解决方案1】:

    我没有任何使用 .nc 文件的经验,但我认为您需要做的,概括地说,是这样的:

    filenames <- list.files(path = ".") # Creates a character vector of all file names in working directory
    

    使用列名创建空数据框:

    final_data <- data.frame(matrix(ncol = ..., nrow = 0)) # enter number of columns you will have in the final dataset
    colnames(final_data) <- c("...", "...", "...", ...) # create column names
    

    对于每个文件名,读入文件,创建日期列并在全局环境中作为对象写入:

    for (i in filenames) {
      pid<-open.nc(i)
      dat<-read.nc(pid) 
    
      date <- ... # use regex to get your date from i and convert it into date
    
      dat$date <- date
    
      final_data <- rbind(final_data, dat)
    }
    

    【讨论】:

    • 首先尝试使用“date
    • 嘿,非常感谢 sp 的帮助!所以我认为有必要的一个小调整是将“read.nc(i)”更改为“read.nc(pid)”,但这可能不是重点。 --- 我对循环的最后一行有点困惑。我不确定数据集是否正确组合成一个数据集。有没有办法可以检查?如果我执行“list(dat$date)”,我只会得到其中一个文件名。我不确定文件是否连接在一起,使得日期变量始终是观察原始文件名。除此之外,循环运行良好。我明白你在做什么,它非常有帮助
    • 是的,read.nc(dat)。为了将它们全部添加到一个数据框中,我首先使用列名创建空数据框(请注意,列名必须与单个文件中的相同,并且要包括您在循环中创建的“日期”)。然后我修改了最后一行,在每次迭代时将行绑定到这个空数据框。查看我的更新版本
    • 这很有意义,谢谢!更近了一步,但我遇到了另一个小障碍。我收到错误消息:Error in rbind(deparse.level, ...) : invalid list argument: all variables should have the same length --- 这个问题可能与我的数据有关,但如果您有任何指导,仍然会有所帮助。我认为问题在于每个数据文件对每个变量都有不同数量的观察,因此很难将每个变量组合成一行。请参阅原始帖子中的屏幕截图。经度 22 个值,纬度 19 个值,因此温度和降水为 19*22
    • 是的,这是一个问题。我认为您应该用 NA 填充空单元格,以确保每列具有相同的行数。也许试试这个 rowr::cbind.fill(final_data, dat, fill = NA) 而不是 rbind(...) - stackoverflow.com/questions/44180030/…
    猜你喜欢
    • 1970-01-01
    • 2020-01-01
    • 2014-10-04
    • 2012-03-19
    • 2012-07-10
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多