Найти самую раннюю дату начала интервала и извлечь интервал (R, lubridate) - PullRequest
0 голосов
/ 22 мая 2019

У меня есть фрейм данных с четырьмя возможными классами S4: интервалы, например:

 id  int_a           int_b             int_c              int_d
 1   2013--2015      2011--2012        NA--NA             2014--2014

мне нужно отсортировать по самой ранней дате начала, которую можно извлечь с помощью int_start (), а затем сохранить этот интервал (или длину), например, как. first_int как новая переменная в наборе данных и повторите для второго, третьего и четвертого.

ожидаемый результат будет:

id  .. first_int      sec_int          third_int          fourth_int
 1  .. 2011--2012     2013--2015       2014--2014         NA--NA

Я добавил кусок моего набора данных ниже

library(lubridate)
so <- structure(list(int_a = new("Interval", .Data = c(24192000, 
                                                          52704000, 0, 64022400, NA, NA, NA, 0, NA, NA), start = structure(c(1286841600, 
                                                                                                                             1327276800, 1157068800, 1370995200, NA, NA, NA, 1296172800, NA, 
                                                                                                                             NA), class = c("POSIXct", "POSIXt"), tzone = "UTC"), tzone = "UTC"), 
                     int_b = new("Interval", .Data = c(NA, 2505600, NA, NA, 
                                                          53222400, 7862400, NA, NA, 0, 116812800), start = structure(c(NA, 
                                                                                                                        1402531200, NA, NA, 1397433600, 1307577600, NA, NA, 1366329600, 
                                                                                                                        1320278400), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
                                    tzone = "UTC"), int_c = new("Interval", .Data = c(NA, 
                                                                                         NA, 19353600, NA, NA, 41472000, 0, NA, NA, NA), start = structure(c(NA, 
                                                                                                                                                             NA, 1287446400, NA, NA, 1238025600, 1433203200, NA, NA, NA
                                                                                         ), class = c("POSIXct", "POSIXt"), tzone = "UTC"), tzone = "UTC"), 
                     int_d = new("Interval", .Data = c(3024000, 9331200, NA, 
                                                          0, 8899200, 36374400, 0, 3196800, 18748800, 28771200), start = structure(c(1316044800, 
                                                                                                                                     1396828800, NA, 1466640000, 1457568000, 1290038400, 1444694400, 
                                                                                                                                     1321315200, 1381968000, 1438300800), class = c("POSIXct", 
                                                                                                                                                                                    "POSIXt"), tzone = "UTC"), tzone = "UTC")), class = c("tbl_df", 
                                                                                                                                                                                                                                          "tbl", "data.frame"), row.names = c(NA, -10L))

Создано в 2019-05-22 с помощью представительного пакета (v0.3.0)

Большое спасибо!

1 Ответ

0 голосов
/ 22 мая 2019

Я немного не уверен в том, что вы действительно ищете здесь, но я думаю, что это может решить вашу проблему. Я немного растерялся из-за того, что часть твоего поста ссылается на

Я могу отсортировать по дате начала, но мне не удается отсортировать по одному признаку интервала, а затем извлечь целое.

Используя purr:: и lubridate::, вы можете сделать следующее:

library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date
library(purrr)

so <- structure(
  list(
    int_a = new("Interval",
                .Data = c(24192000, 52704000, 0, 64022400, NA, NA, NA, 0, NA, NA),
                start = structure(c(1286841600, 1327276800, 1157068800, 1370995200, NA, NA, NA, 1296172800, NA, NA), 
                                  class = c("POSIXct", "POSIXt"), 
                                  tzone = "UTC"), tzone = "UTC"),

    int_b = new("Interval", 
                .Data = c(NA, 2505600, NA, NA, 53222400, 7862400, NA, NA, 0, 116812800), 
                start = structure(c(NA, 1402531200, NA, NA, 1397433600, 1307577600, NA, NA, 1366329600, 1320278400),
                                  class = c("POSIXct", "POSIXt"),
                                  tzone = "UTC"), tzone = "UTC"),

    int_c = new("Interval",
                .Data = c(NA, NA, 19353600, NA, NA, 41472000, 0, NA, NA, NA),
                start = structure(c(NA, NA, 1287446400, NA, NA, 1238025600, 1433203200, NA, NA, NA), 
                                  class = c("POSIXct", "POSIXt"), 
                                  tzone = "UTC"),tzone = "UTC"),

    int_d = new("Interval",
                .Data = c(3024000, 9331200, NA, 0, 8899200, 36374400, 0, 3196800, 18748800, 28771200), 
                start = structure(c(1316044800, 1396828800, NA, 1466640000, 1457568000, 1290038400, 1444694400, 1321315200, 1381968000, 1438300800), 
                                  class = c("POSIXct", "POSIXt"), 
                                  tzone = "UTC"), tzone = "UTC")),

  class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -10L))

earliest_start_interval_list <- map_at(.x = so, .at = 1:ncol(so), ~ min(lubridate::int_start(.x), na.rm = TRUE))

Создано в 2019-05-22 с помощью представительного пакета (v0.3.0)

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