【问题标题】:Reading data from text file and combining it with date in r从文本文件中读取数据并将其与 r 中的日期相结合
【发布时间】:2016-06-18 21:52:35
【问题描述】:

我从互联网下载数据。我想提取数据并创建一个数据框。您可以在以下过滤后的数据集链接中找到数据:http://www.esrl.noaa.gov/gmd/dv/data/index.php?category=Ozone&type=Balloon。在 9 个过滤数据集的站点页面底部,您可以选择任何站点。 Say Suva, 斐济 (SUV):

我编写了以下代码来创建一个数据框,该数据框将启动日期作为每个文件的数据框的一部分。

    setwd("C:/Users/")
    path = "~C:/Users/"
    files <- lapply(list.files(pattern = '\\.l100'), readLines) 
    test.sample<-do.call(rbind, lapply(files, function(lines){
      data.frame(datetime = as.POSIXct(sub('^.*Launch Date : ', '', lines[grep('Launch Date :', lines)])),
                 # and the data, read in as text
                 read.table(text = lines[(grep('Sonde Total', lines) + 1):length(lines)]))
    }))

文件来自 FTP 服务器。即使我用.txt 尝试过,文件的模式对我来说并不熟悉,但它不起作用。您能否调整上述代码或任何其他代码以获取数据框。

提前谢谢你。

【问题讨论】:

  • 您的方法看起来不错,但我不明白什么不起作用。仅仅是日期的格式不完全是 asPOSIXct 所期望的。试试lubridate::dmy()
  • @Richard Telford。谢谢你的提示。我尝试使用 POSITXlt 和 lubridate,但它似乎对我不起作用。你能从网站上查一下吗?这让我很难受。
  • 至少在我打开的文件中,“Launch Date”和“:”之间有不止一个空格。 grep 无法识别搜索字符串,sub 也不会。您可以使用正则表达式来处理任意数量的空格。代码非常简洁——并不总是一件好事!

标签: r dataframe ftp data-extraction


【解决方案1】:

我认为问题在于搜索字符串不匹配“启动日期:”不匹配文件中的内容(至少是我检查的那个)。

这应该可以工作

lines <- "Launch Date    : 11 June 1991"
lubridate::dmy(sub('^.*Launch Date.*: ', '', lines[grep('Launch Date', lines)]))

如果您将问题分解为步骤而不是一句话,代码可能会更容易调试

【讨论】:

  • 你的表情看起来不错。如何仅从数据中获取值。我的意思是文件的表格部分。我选择了(grep('Sonde Total', lines)+1),但我得到了:`(grep('Sonde Total', lines)+1):length(lines): argument of length 0 中的错误。这对你有意义吗。关于文件类型你能说什么?我猜是.txt我应该在文件的pattern=''中放什么?
【解决方案2】:

我采取了以下方法:

td <- tempdir()
setwd(td)

ftp <- 'ftp://ftp.cmdl.noaa.gov/ozwv/Ozonesonde/Suva,%20Fiji/100%20Meter%20Average%20Files/'
files <- RCurl::getURL(ftp, dirlistonly = T)
files <- strsplit(files, "\n")
files <- unlist(files)

dat <- list()
for (i in 1:length(files)) {
  download.file(paste0(ftp, files[i]), 'data.txt')
  df <- read.delim('data.txt', sep = "", skip = 17)
  ld <- as.character(read.delim('data.txt')[9, ])
  ld <- strsplit(ld, ":")[[1]][2]
  df$launch.date <- stringr::str_trim(ld)
  dat[[i]] <- df ; rm(df)
}

【讨论】:

  • 我试过你的代码,但给了我错误:'rying URL 'ftp://ftp.cmdl.noaa.gov/ozwv/Ozonesonde/Suva,%20Fiji/100%20Meter%20Average%20Files/fj001_1997_02_06_22.l100using Synchronous WinInet callsError in download.file(paste0(ftp, files[i]), "data.txt"):'无法打开 URL'ftp.cmdl.noaa.gov/ozwv/Ozonesonde/Suva,%20Fiji/… 另外:警告消息:In download.file(paste0(ftp, files[i]), "data.txt")InternetOpenUrl failed: '9#›l'您认为错误是由于抓取网址造成的吗?`
  • @G1124E 我不确定这个错误。该代码在我的机器上运行良好。
猜你喜欢
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
相关资源
最近更新 更多