使用R Apply系列而不是for循环

时间:2019-05-08 22:18:42

标签: r for-loop apply

我在使用R从数据库中提取数据时遇到了麻烦。手册中提供的代码仅部分起作用。它检索了157个可用站点中的5个。

我的同事提供了一个循环功能来检索数据。我想要一种可能适用于R的应用家族的替代解决方案。

不幸的是,很难完全复制该问题。希望有人能理解循环功能并能够提出替代方案

library(Hilltop)
library(zoo)
dfile <- HilltopData("M:/E_Science/IT/Tideda/HilltopArchive/MonitorWells.hts")

在此步骤中,我将创建一个特征矢量,其特征是距地面的深度为测量类型。这提供了包含157个位点的字符向量。

sites <- c(unlist(MeasurementList(dfile,"") %>% 
  filter(Measurement=="Depth From Land Surface [Manual Water Level]") %>% 
  select(Site)))

要查询数据库,我运行此代码,它提供5个站点的数据列表。但是我希望是157。

retrieve <- GetData(dfile,
sites,
measurement = "Depth From Land Surface[Manual Water Level]",
startTime = "",
endTime = "",
method = "",
interval = "")

此循环功能从所有站点检索数据。

measurements_LS2 <- measurements1 %>% 
  filter(Measurement=="Depth From Land Surface [Manual Water Level]") %>% 
  select(Site,Measurement)

length <- length(measurements_LS2$Site)
allData <- NULL
length <- length(measurements_LS2$Site)
allData <- NULL
for(sm in 1:length) {
  tempdata <- NULL
  zoodata <- NULL
  site <- measurements_LS2$Site[sm]
  meas <- measurements_LS2$Measurement[sm]
  zoodata <- tryCatch({GetData(dfile, 
                      site, 
                      meas,
                      "",
                      "",
                      method="",
                      interval="")}, error = function(err) {
                        message(paste(site, meas, err))
                      })
  if(!is.null(zoodata)) {
    tempdata <- fortify.zoo(zoodata)
    tempdata$Site <- site
    tempdata$Measurement <- meas
  }

  if(is.null(allData)) {
    allData <- tempdata
  } else {
    allData <- if(!is.null(tempdata)) {rbind(allData, tempdata)}
  }

  }

有人能建议一些可能适用的功能吗?循环看起来非常复杂。

谢谢

0 个答案:

没有答案