Я пытаюсь написать код, чтобы частично автоматизировать процесс поднабора набора данных о температуре с датами начала / окончания в наборе данных о зимней смертности, при этом последний имеет более 100 наблюдений, каждое из которых заканчивается одним такимподмножество временных данных.Я планирую рассчитать некоторые температурные переменные, используя каждое из этих подмножеств, и добавить их во второй набор данных ... но я завис на шаге поднабора.
Вот пример данных и мой код (и дайте мне знать, если у вас есть предложения о том, как сделать этот минимум воспроизводимым. Я пока не слишком много писал здесь):
# Temperature data dput..
tempd <- structure(list(date = structure(c(1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L), .Label = c("12/1/2014", "12/2/2014", "12/3/2014", "12/4/2014", "12/5/2014", "12/6/2014"), class = "factor"), time = structure(c(2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("0:00:00", "12:00:00"), class = "factor"), temp = c(3.274, -0.986, -0.088, 0.495, 6.23, 0.934, 0.715, -4.227, -1.584, 0.88, 1.967)), .Names = c("date", "time", "temp"), class = "data.frame", row.names = c(NA, -11L))
# and mortality data dput..
owmd <- structure(list(siteyear = structure(c(1L, 1L, 1L), .Label = "s1.y1", class = "factor"), winter = c(1415L, 1415L, 1415L), date = structure(1:3, .Label = c("12/1/2014", "12/3/2014", "12/5/2014"), class = "factor"), site = structure(c(1L, 1L, 1L), .Label = "s1", class = "factor"), mort = c(0.06651485, 0.120592869, 0.135272089)), .Names = c("siteyear", "winter", "date", "site", "mort"), class = "data.frame", row.names = c(NA, -3L))
РЕДАКТИРОВАТЬ: В случае, если я слишком упростил свой набор временных данных, я скажу, что мои наборы реальных температурных данных (их 10 (по одному для каждой комбинации сайт-год)) содержат значения температуры с 15-минутными интервалами.(т.е. 96 / день).Важно отметить, что я хочу, чтобы эти временные подмножества начинались и заканчивались в 12 часов, поэтому мне нужно иметь возможность указать время и дату в пределах подмножеств (обратите внимание, что самый первый временный подмножество набора данных может не начинаться с12:00, если сам набор данных начинается позже)
Итак, код ..
library(tidyverse)
library(lubridate)
# Factorize winter and 'date-ize' date
owmd$winter <- as.factor(owmd$winter)
owmd$date <- as.Date(owmd$date, '%m/%d/%Y')
# Create start date (date value for the prior observation)
owmd %>%
tbl_df() %>%
mutate(sdate = lag(date, 1)) -> owmd
# Now the temperature dataset
# Factorize date, do *something* with time, and create datetime
tempd$date2 <- as.Date(tempd$date, '%m/%d/%Y')
tempd %>%
mutate(datetime = ymd_hms('2014-12-01 12:00:00') + c(0:10) * hours(12),
time2 = parse_time(tempd$time)) -> tempd
# write a function that creates, for each observation in owmd, a subset of the tempd data bounded by owmd$date and owmd$sdate ('start date')
subfun <- function(x,y) {
start <- owmd[(x-1),3]
end <- owmd[x,3]
period <- filter(y, date2 >= start & time2 >= '12:00:00' & date2 <= end & time2 <= '12:00:00')
}
# test it
subfun(3, tempd)
Нахождение правильного подмножества условий в period
- вот где я вешаю трубку.Я получаю
Warning messages:
1: In evalq((date2 >= start & time2 >= "12:00:00") & (date2 <= end & :
Incompatible methods (">=.Date", "Ops.data.frame") for ">="
2: In evalq((date2 >= start & time2 >= "12:00:00") & (date2 <= end & :
Incompatible methods ("<=.Date", "Ops.data.frame") for "<="
Кажется, что не должно быть слишком сложно использовать owmd$date
и owmd$sdate
(дата начала) в качестве границ для подмножеств набора данных температуры, но мне не удалось выяснитьправильное подмножество условий.Поможет ли другой формат для tempd$time
?Я включаю temp$datetime
на случай, если это можно будет использовать, но я не понял, как.
Любые мысли для начинающего очень ценятся.
Вот моя информация о сеансе:
R версия 3.4.4 (2018-03-15)
Платформа: x86_64-w64-mingw32 / x64 (64-разрядная версия)
Работает под: Windows> = 8x64 (сборка 9200)