Как я могу создать функцию для получения подмножества даты и времени второго кадра данных? - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь написать код, чтобы частично автоматизировать процесс поднабора набора данных о температуре с датами начала / окончания в наборе данных о зимней смертности, при этом последний имеет более 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)

1 Ответ

0 голосов
/ 22 октября 2018

Спасибо за предоставление воспроизводимых данных!Есть ряд исправлений, которые могут помочь сделать это легче и более читабельным;ниже я подхожу к этому.По сути, ваша цель состоит в том, чтобы выяснить, какие измерения температуры соответствуют каждому периоду смертности, чтобы получить статистику по ним.Есть несколько ключевых реализаций:

  1. Вам нужна функция, которая принимает фрейм данных, столбец для наложения условий и два условия, но это уже то, что dplyr::filter делает, поэтому нам не нужнодействительно другая функция-обертка;
  2. Было бы полезно сохранить подмножества с соответствующими данными смертности и датами начала / окончания, поэтому мы должны использовать список-столбец для его хранения;
  3. Мы можем объединить 12:00:00 с датами в owmd перед синтаксическим анализом, чтобы они были datetime;
  4. Мы можем сделать кучу изменений стиля (например, придерживаться парсеров lubridate, так как вы уже используетепакет)

Это означает, что я могу сделать это:

library(tidyverse)
library(lubridate)
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))
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))

mort <- owmd %>%
  mutate(
    winter = factor(winter),
    date = date %>% str_c(., " 12:00:00") %>% mdy_hms(),
    sdate = lag(date)
  )
temp <- tempd %>%
  mutate(datetime = str_c(date, " ", time) %>% mdy_hms(), date = mdy(date))

mort_subs <- mort %>%
  as_tibble() %>%
  mutate(
    subset = map2(sdate, date, ~ filter(temp, datetime >= .x & datetime <= .y)
    )
  )
mort_subs
#> # A tibble: 3 x 7
#>   siteyear winter date                site    mort sdate              
#>   <fct>    <fct>  <dttm>              <fct>  <dbl> <dttm>             
#> 1 s1.y1    1415   2014-12-01 12:00:00 s1    0.0665 NA                 
#> 2 s1.y1    1415   2014-12-03 12:00:00 s1    0.121  2014-12-01 12:00:00
#> 3 s1.y1    1415   2014-12-05 12:00:00 s1    0.135  2014-12-03 12:00:00
#> # ... with 1 more variable: subset <list>

, поэтому теперь у нас есть правильное подмножество для каждой исходной строки owmd.Каждый элемент столбца subset содержит фрейм данных, который является подмножеством temp, соответствующим sdate и date.Tidyverse имеет много инструментов, которые позволяют нам легко работать с этими данными;мы можем unnest, group_by и summarise, чтобы получить статистику по исходной строке:

mort_subs %>%
  unnest() %>%
  group_by(siteyear, winter, sdate, date, site, mort) %>%
  summarise(mean_temp = mean(temp))
#> # A tibble: 2 x 7
#> # Groups:   siteyear, winter, sdate, date, site [?]
#>   siteyear winter sdate               date                site   mort
#>   <fct>    <fct>  <dttm>              <dttm>              <fct> <dbl>
#> 1 s1.y1    1415   2014-12-01 12:00:00 2014-12-03 12:00:00 s1    0.121
#> 2 s1.y1    1415   2014-12-03 12:00:00 2014-12-05 12:00:00 s1    0.135
#> # ... with 1 more variable: mean_temp <dbl>

Или мы можем выполнить аналогичную вещь, используя map_dbl для перебора списка subset-column:

mort_subs %>%
  mutate(mean_temp = map_dbl(subset, ~ mean(.$temp)))
#> # A tibble: 3 x 8
#>   siteyear winter date                site    mort sdate              
#>   <fct>    <fct>  <dttm>              <fct>  <dbl> <dttm>             
#> 1 s1.y1    1415   2014-12-01 12:00:00 s1    0.0665 NA                 
#> 2 s1.y1    1415   2014-12-03 12:00:00 s1    0.121  2014-12-01 12:00:00
#> 3 s1.y1    1415   2014-12-05 12:00:00 s1    0.135  2014-12-03 12:00:00
#> # ... with 2 more variables: subset <list>, mean_temp <dbl>

Создано в 2018-10-24 с помощью представительного пакета (v0.2.0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...