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==