У меня есть следующие поля в наборе данных.
Location : Unique location id of place of installation
Serial : Unique serial number of product
Last Report Date : Date of last communication with location
Рассмотрим только два местоположения, каждое из которых имеет два серийных номера.
Location Serial LDate SDate
01 1234 2020-02-29 2020-02-20
01 4321 2020-02-29 2020-02-29
02 2143 2020-03-03 2020-03-03
02 1432 2020-03-03 2020-03-03
Здесь дата последнего отчета о серийных номерах приведена только для справки и фактически не известна. У меня есть набор данных только с одним сериалом из каждого местоположения, как показано ниже:
location serial SDate
01 1234 2020-02-29
02 1432 2020-03-03
В этом наборе данных SDate является самой последней отчетной датой среди всех сериалов в местоположении.
Данные находится в ведре S3. URL содержит местоположение и дату последнего отчета. Я создаю URL-адрес динамически, чтобы загрузить данные. URL выглядит следующим образом:
url for location 01:"s3://xxxx.xxxx.2020/01/readings/01-20200229.csv"
url for location 02:"s3://xxxx.xxxx.2020/02/readings/02-20200303.csv"
Я написал функцию для загрузки данных для сериалов в мой набор данных. Логика c этой функции выглядит следующим образом:
for(i in 1:nrow(dataset)) {
date = as.Date(paste0(dataset$SDate[[i]]))
while (!exists("latest")) {
latest = s3download(dataset$location[[i]], dataset$serial[[i]], date)
date = date - 1
}
if (!exists("data")) {
data = latest
rm(latest)
}
else if (exists("data")) {
data = rbind(data, latest)
rm(latest)
}
}
Функция выглядит следующим образом:
s3download = function(location, serial, date) {
url = paste0(
"s3://xxxx.xxxx.",
lubridate::year(date),
"/",
location,
"/readings/",
location,
"-",
gsub("-", "" , as.character(date)),
".csv"
)
out = tryCatch({
latestdata = data.frame(aws.s3::s3read_using(read.csv, object = paste(url), header = FALSE))
}, error = function(cond) {
message(cond)
return(NA)
}, warning = function(cond) {
message(cond)
return(NULL)
},
finally = {
message(paste("Dowloaded))
message("Thank you")
})
return(latestdata)
}
Вышеуказанная функция не работает должным образом. Логика c неверна.
Что нужно сделать, это
1 Pick the first location and date from dataset
2 Call the function to dynamically create a url with the date
3 Download the data from S3
a Download the data for the above date for the location
b See if the data for the desired serial is available
c If not, repeat steps and b for next dates for this location till data for serial is met
- Repeat step 1:3 for next record in dataset
Пожалуйста, помогите. Заранее спасибо.