This R Markdown processes raw data from the Tall Tower database. The processing consists of reading the .csv input file with raw data and computing the average value between measurements from sensors (humidity,pressure, wind direction and speed) installed at different booms of the mast at the same height. It requires data in .csv format derived this repository: Tower2csv

Let’s start by simply reading the data.

df <- read.csv(file="2009.csv", header=TRUE)

Now, we continue by visualizing the data frame. If browsing the data frame by clicking in the black right arrow, it’s possible to see that there is more than one sensor for each parameter. For instance, there are three wind direction sensors at 116 m (S1, S2 and S3), namely, wdiragl116S1, wdiragl116S2 and wdiragl116S3.

head(df)

Next, a function to process the data named “processData” is defined. It averages data from different sensors at the same height. This function requires two inputs: (i) a data frame, (ii) and a list of heights. It is worth noting that the average can be directly computed because the Tall Tower database has been pre-processed and the mast shadow effect was previously fixed.

processData <- function(df,allHeights){
## FUNCTION TO PROCESS DATA ####################################################
# Defining the sensors' names
  allSensors = list("huragl","psagl","taagl","wdiragl","windagl")
# New data frame to receive processed data
  dfProcessed <- df["time"]

  for (sensor in allSensors){
    for (height in allHeights){
    # Sensor full name
      sensorFullName = paste(sensor, height, sep = "")
    # All columns from "sensor" at the same height 
      columns = grep(sensorFullName, colnames(df), value = TRUE)
      
    # Checking if the columns was found
      if (length(columns) == 0) { # If none columns was found
        print(paste(sensorFullName," column was not found"))
        next # Continue with the next iteration step
      }
      print(paste("Reading", toString(columns)))
      data_tmp = df[columns]  # Data from "sensor"
      
    # Computing the mean value between different sensors at the same height
      dfProcessed[sensorFullName] <- rowMeans(data_tmp, na.rm = T)
    }
  }
  return(dfProcessed)
}

In the next code cell/chunk we call the function that displays which sensor was found.

allHeights = list(21,70,116) # list of heights
dfProcessed <- processData(df,allHeights)
[1] "Reading huragl21S1"
[1] "Reading huragl70S1"
[1] "Reading huragl116S1"
[1] "Reading psagl21S1"
[1] "psagl70  column was not found"
[1] "psagl116  column was not found"
[1] "Reading taagl21S1"
[1] "Reading taagl70S1"
[1] "Reading taagl116S1"
[1] "Reading wdiragl21S1, wdiragl21S2, wdiragl21S3, wdiragl21S4"
[1] "Reading wdiragl70S1, wdiragl70S2, wdiragl70S3, wdiragl70S4"
[1] "Reading wdiragl116S1, wdiragl116S2, wdiragl116S3, wdiragl116S4"
[1] "Reading windagl21S1, windagl21S2, windagl21S3"
[1] "Reading windagl70S1, windagl70S2, windagl70S3"
[1] "Reading windagl116S1, windagl116S2, windagl116S3"

In the following, we visualize the processed data.

head(dfProcessed)

Finally, the processed data frame can be saved or exported as .csv file by using the following command lines

## Exporting dataframe to a .csv file ##########################################
saveFileName = paste(getwd(),'/',"2009_avg",".csv", sep = "")
write.csv(dfProcessed, saveFileName, row.names=FALSE, quote=FALSE, 
          fileEncoding = "UTF-8")
LS0tDQp0aXRsZTogIlByb2Nlc3MgVGFsbCBUb3dlciBEYXRhIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQplZGl0b3Jfb3B0aW9uczogDQogIG1hcmtkb3duOiANCiAgICB3cmFwOiA3Mg0KLS0tDQoNClRoaXMgW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIHByb2Nlc3NlcyByYXcgZGF0YSBmcm9tIHRoZSBUYWxsIFRvd2VyIGRhdGFiYXNlLiANClRoZSBwcm9jZXNzaW5nIGNvbnNpc3RzIG9mIHJlYWRpbmcgdGhlIC5jc3YgaW5wdXQgZmlsZSB3aXRoIHJhdyBkYXRhIGFuZCBjb21wdXRpbmcgdGhlIGF2ZXJhZ2UgdmFsdWUgYmV0d2VlbiBtZWFzdXJlbWVudHMgZnJvbSBzZW5zb3JzIChodW1pZGl0eSxwcmVzc3VyZSwgd2luZCBkaXJlY3Rpb24gYW5kIHNwZWVkKSBpbnN0YWxsZWQgYXQgZGlmZmVyZW50IGJvb21zIG9mIHRoZSBtYXN0IGF0IHRoZSBzYW1lIGhlaWdodC4gDQpJdCByZXF1aXJlcyBkYXRhIGluIC5jc3YgZm9ybWF0IGRlcml2ZWQgdGhpcyByZXBvc2l0b3J5OiBbVG93ZXIyY3N2XShodHRwczovL2dpdGh1Yi5jb20vbWFyY29zcC1hcmF1am8vVG93ZXIyY3N2KQ0KDQpMZXQncyBzdGFydCBieSBzaW1wbHkgcmVhZGluZyB0aGUgZGF0YS4NCg0KYGBge3J9DQpkZiA8LSByZWFkLmNzdihmaWxlPSIyMDA5LmNzdiIsIGhlYWRlcj1UUlVFKQ0KYGBgDQoNCk5vdywgd2UgY29udGludWUgYnkgdmlzdWFsaXppbmcgdGhlIGRhdGEgZnJhbWUuIElmIGJyb3dzaW5nIHRoZSBkYXRhDQpmcmFtZSBieSBjbGlja2luZyBpbiB0aGUgYmxhY2sgcmlnaHQgYXJyb3csIGl0J3MgcG9zc2libGUgdG8gc2VlIHRoYXQNCnRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgc2Vuc29yIGZvciBlYWNoIHBhcmFtZXRlci4gRm9yIGluc3RhbmNlLCB0aGVyZQ0KYXJlIHRocmVlIHdpbmQgZGlyZWN0aW9uIHNlbnNvcnMgYXQgMTE2IG0gKFMxLCBTMiBhbmQgUzMpLCBuYW1lbHksDQp3ZGlyYWdsMTE2UzEsIHdkaXJhZ2wxMTZTMiBhbmQgd2RpcmFnbDExNlMzLg0KDQpgYGB7cn0NCmhlYWQoZGYpDQpgYGANCg0KTmV4dCwgYSBmdW5jdGlvbiB0byBwcm9jZXNzIHRoZSBkYXRhIG5hbWVkICJwcm9jZXNzRGF0YSIgaXMgZGVmaW5lZC4gSXQNCmF2ZXJhZ2VzIGRhdGEgZnJvbSBkaWZmZXJlbnQgc2Vuc29ycyBhdCB0aGUgc2FtZSBoZWlnaHQuIFRoaXMgZnVuY3Rpb24NCnJlcXVpcmVzIHR3byBpbnB1dHM6IChpKSBhIGRhdGEgZnJhbWUsIChpaSkgYW5kIGEgbGlzdCBvZiBoZWlnaHRzLiBJdCBpcw0Kd29ydGggbm90aW5nIHRoYXQgdGhlIGF2ZXJhZ2UgY2FuIGJlIGRpcmVjdGx5IGNvbXB1dGVkIGJlY2F1c2UgdGhlIFRhbGwNClRvd2VyIGRhdGFiYXNlIGhhcyBiZWVuIHByZS1wcm9jZXNzZWQgYW5kIHRoZSBtYXN0IHNoYWRvdyBlZmZlY3Qgd2FzDQpwcmV2aW91c2x5IGZpeGVkLg0KDQpgYGB7cn0NCnByb2Nlc3NEYXRhIDwtIGZ1bmN0aW9uKGRmLGFsbEhlaWdodHMpew0KIyMgRlVOQ1RJT04gVE8gUFJPQ0VTUyBEQVRBICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgRGVmaW5pbmcgdGhlIHNlbnNvcnMnIG5hbWVzDQogIGFsbFNlbnNvcnMgPSBsaXN0KCJodXJhZ2wiLCJwc2FnbCIsInRhYWdsIiwid2RpcmFnbCIsIndpbmRhZ2wiKQ0KIyBOZXcgZGF0YSBmcmFtZSB0byByZWNlaXZlIHByb2Nlc3NlZCBkYXRhDQogIGRmUHJvY2Vzc2VkIDwtIGRmWyJ0aW1lIl0NCg0KICBmb3IgKHNlbnNvciBpbiBhbGxTZW5zb3JzKXsNCiAgICBmb3IgKGhlaWdodCBpbiBhbGxIZWlnaHRzKXsNCiAgICAjIFNlbnNvciBmdWxsIG5hbWUNCiAgICAgIHNlbnNvckZ1bGxOYW1lID0gcGFzdGUoc2Vuc29yLCBoZWlnaHQsIHNlcCA9ICIiKQ0KICAgICMgQWxsIGNvbHVtbnMgZnJvbSAic2Vuc29yIiBhdCB0aGUgc2FtZSBoZWlnaHQgDQogICAgICBjb2x1bW5zID0gZ3JlcChzZW5zb3JGdWxsTmFtZSwgY29sbmFtZXMoZGYpLCB2YWx1ZSA9IFRSVUUpDQogICAgICANCiAgICAjIENoZWNraW5nIGlmIHRoZSBjb2x1bW5zIHdhcyBmb3VuZA0KICAgICAgaWYgKGxlbmd0aChjb2x1bW5zKSA9PSAwKSB7ICMgSWYgbm9uZSBjb2x1bW5zIHdhcyBmb3VuZA0KICAgICAgICBwcmludChwYXN0ZShzZW5zb3JGdWxsTmFtZSwiIGNvbHVtbiB3YXMgbm90IGZvdW5kIikpDQogICAgICAgIG5leHQgIyBDb250aW51ZSB3aXRoIHRoZSBuZXh0IGl0ZXJhdGlvbiBzdGVwDQogICAgICB9DQogICAgICBwcmludChwYXN0ZSgiUmVhZGluZyIsIHRvU3RyaW5nKGNvbHVtbnMpKSkNCiAgICAgIGRhdGFfdG1wID0gZGZbY29sdW1uc10gICMgRGF0YSBmcm9tICJzZW5zb3IiDQogICAgICANCiAgICAjIENvbXB1dGluZyB0aGUgbWVhbiB2YWx1ZSBiZXR3ZWVuIGRpZmZlcmVudCBzZW5zb3JzIGF0IHRoZSBzYW1lIGhlaWdodA0KICAgICAgZGZQcm9jZXNzZWRbc2Vuc29yRnVsbE5hbWVdIDwtIHJvd01lYW5zKGRhdGFfdG1wLCBuYS5ybSA9IFQpDQogICAgfQ0KICB9DQogIHJldHVybihkZlByb2Nlc3NlZCkNCn0NCmBgYA0KDQpJbiB0aGUgbmV4dCBjb2RlIGNlbGwvY2h1bmsgd2UgY2FsbCB0aGUgZnVuY3Rpb24gdGhhdCBkaXNwbGF5cyB3aGljaA0Kc2Vuc29yIHdhcyBmb3VuZC4NCg0KYGBge3J9DQphbGxIZWlnaHRzID0gbGlzdCgyMSw3MCwxMTYpICMgbGlzdCBvZiBoZWlnaHRzDQpkZlByb2Nlc3NlZCA8LSBwcm9jZXNzRGF0YShkZixhbGxIZWlnaHRzKQ0KYGBgDQoNCkluIHRoZSBmb2xsb3dpbmcsIHdlIHZpc3VhbGl6ZSB0aGUgcHJvY2Vzc2VkIGRhdGEuDQoNCmBgYHtyfQ0KaGVhZChkZlByb2Nlc3NlZCkNCmBgYA0KDQpGaW5hbGx5LCB0aGUgcHJvY2Vzc2VkIGRhdGEgZnJhbWUgY2FuIGJlIHNhdmVkIG9yIGV4cG9ydGVkIGFzIC5jc3YgZmlsZQ0KYnkgdXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmVzDQoNCmBgYHtyfQ0KIyMgRXhwb3J0aW5nIGRhdGFmcmFtZSB0byBhIC5jc3YgZmlsZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnNhdmVGaWxlTmFtZSA9IHBhc3RlKGdldHdkKCksJy8nLCIyMDA5X2F2ZyIsIi5jc3YiLCBzZXAgPSAiIikNCndyaXRlLmNzdihkZlByb2Nlc3NlZCwgc2F2ZUZpbGVOYW1lLCByb3cubmFtZXM9RkFMU0UsIHF1b3RlPUZBTFNFLCANCiAgICAgICAgICBmaWxlRW5jb2RpbmcgPSAiVVRGLTgiKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg==