Исследователь-эколог, новичок в программировании, полегче со мной!
У меня есть два прибора для контроля качества воздуха (пылесос и птрак), которые регистрируют данные и сохраняют их в виде файлов .csv. Моя цель — автоматизировать процесс очистки данных с помощью функционального программирования. Каждый инструмент записывает в разные промежутки времени (30 секунд против 1 секунды), и каждый инструмент имеет уникальный заголовок.
У меня уже есть функция, которая считывает данные ptrak. Он удаляет неприятный заголовок и преобразует столбцы даты и времени в один как .POSIX datetime. Результатом является новый широкоформатный фрейм данных только с двумя столбцами: дата-время и концентрация числа частиц (pnc).
Вот функция ptrak:
## assume there is only one file per directory for now
read.ptrak<-function(fpath){
x<-read.csv(fpath,skip=30,header=FALSE,stringsAsFactors=FALSE) #removing the first 30 rows of garbage
colnames(x) <- c("date","time","pnc") #creating my own header
##merge date and time column together
x$datetime<-strptime(paste(x$date,x$time), "%m/%d/%Y %H:%M:%S", tz="UTC")
## convert the first column to a posix timestamp
x$datetime<-as.POSIXct(x$datetime,format=dt_format, tz="UTC")
x<-x[,-c(1:2)] ## remove redundant variables date, and time
x<-x[,c(2:1)] ## reorder columns so datetime is first
return(x)
}
#okay now we can apply our function to our ptrak csv file:
ptrak_data <- read.ptrak(**INSERT FILE PATH HERE**)
head(ptrak_data)
#everything looks great!
У меня проблемы с данными пылесборника. Вместо того, чтобы иметь столбец даты и времени для каждого наблюдения, мне предоставляется только время начала, которое находится в заголовке. Фактический кадр данных предоставляет только общее прошедшее время с 30-секундными интервалами с этого времени начала. Я хочу создать новый кадр данных с временной меткой POSIX и пятью массовыми концентрациями частиц (см. ниже), которые я могу позже объединить по дате и времени с ptrak. Может ли кто-нибудь предоставить функцию, которая использует время начала и прошедшее время для создания нового вектора даты и времени, а затем удаляет заголовок, чтобы у меня остался широкоформатный фрейм данных с двумя столбцами?
Вот моя первая попытка очистки данных от пыли:
read.dtrak<-function(fpath){
x<-read.csv(fpath,skip=36,header=FALSE,stringsAsFactors=FALSE)
colnames(x)<-c("elapsedtime","pm1","pm2.5","pm4","pm10","total","alarms","errors")
## need to read in the same file again and keep the header to extract the start time and start date:
y<-read.csv(fpath,skip=6,header=FALSE,stringsAsFactors=FALSE)
colnames(y)<-c("variable","value") ## somewhat arbitrary colnames for temporary df
starttime <-y[1,2]
startdate <-y[2,2]
startdatetime <- strptime(paste(startdate,starttime), "%m/%d/%Y %H:%M:%S", tz="UTC")
#convert to posix timestamp:
startdatetime <-as.POSIXct(startdatetime, format=dt_format, tz="UTC")
## create a new variable called datetime in dataframe 'x'
x$datetime <- startdatetime + x$elapsedtime ## this is giving me the following error: "Error in unclass(e1) + unclass(e2) : non-numeric argument to binary operator
return(x)
}
Конечная цель состоит в том, чтобы создать очищенный фрейм данных, аналогичный данным ptrak, за исключением того, что вместо отчета о концентрации одного числа частиц (pnc) должны быть PM1, PM2,5, PM4, PM10 и ИТОГО (см. dusttrak_data.csv ).
Заранее приносим извинения за то, что не включили примеры данных в пост. Я не мог понять, как создать образец данных, включающий эти надоедливые заголовки!
Поиск ответа на этот вопрос сэкономил бы мне +100 часов ручной очистки данных, поэтому я очень ценю ваше понимание!
Вот данные: Ptrak, Dusttrak EDIT: преобразование решения Dave2e в функцию для тех, кто заинтересован.
read.dtrak<-function(fpath){
sdate<-read.csv(fpath, header=FALSE, nrow=1, skip =7)
stime <-read.csv(fpath, header = FALSE, nrow=1, skip=8)
startDate<-as.POSIXct(paste(sdate$V2, stime$V2), "%m/%d/%Y %H:%M:%S", tz="UTC")
x<-read.csv(fpath, skip=36, stringsAsFactors = FALSE)
names(x)<-c("elapsedtime","pm1","pm2.5","pm4","pm10","total","alarms","errors")
x$elapsedtime<-x$elapsedtime+startDate
x<-x[,-c(7,8)] #remove the alarms and errors variables
names(x$elapsedtime)<-"datetime" #rename timestamp to datetime
return(x)
}
read.dtrak("**INSERT FILE PATH HERE**")