Преобразование эпохи в строку метки времени для каждой группы и для конкретной ссылки на часовой пояс группы - PullRequest
0 голосов
/ 30 октября 2018

Вот кадр данных у меня:

df <- data_frame(
  id = rep(c(1, 2, 3), 3),
  timestamp = as.integer(Sys.time()),
  timezone = rep(
    c('America/New_York', 'America/Chicago', 'America/Los_Angeles'), 3
    )
  )

df
# A tibble: 9 x 3
     id  timestamp timezone
  <dbl>      <int> <chr>
1     1 1540887120 America/New_York
2     2 1540887120 America/Chicago
3     3 1540887120 America/Los_Angeles
4     1 1540887120 America/New_York
5     2 1540887120 America/Chicago
6     3 1540887120 America/Los_Angeles
7     1 1540887120 America/New_York
8     2 1540887120 America/Chicago
9     3 1540887120 America/Los_Angeles

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

library(dplyr)
df %>%
  group_by(id) %>%
  mutate(
    new_timestamp = as.POSIXct(
      timestamp, origin = '1970-01-01', tz = first(timezone)
      )
    )
# A tibble: 9 x 4
# Groups:   id [3]
     id  timestamp timezone            new_timestamp
  <dbl>      <int> <chr>               <dttm>
1     1 1540887120 America/New_York    2018-10-30 08:12:00
2     2 1540887120 America/Chicago     2018-10-30 08:12:00
3     3 1540887120 America/Los_Angeles 2018-10-30 08:12:00
4     1 1540887120 America/New_York    2018-10-30 08:12:00
5     2 1540887120 America/Chicago     2018-10-30 08:12:00
6     3 1540887120 America/Los_Angeles 2018-10-30 08:12:00
7     1 1540887120 America/New_York    2018-10-30 08:12:00
8     2 1540887120 America/Chicago     2018-10-30 08:12:00
9     3 1540887120 America/Los_Angeles 2018-10-30 08:12:00

Есть ли способ заставить это работать?

Следующее дает мне правильный результат, но как список фреймов данных, что НЕ то, что я хочу:

lapply(
  split(df, df$id), function(x) {
    x$new_timestamp <- as.POSIXct(
      x$timestamp, tz = unique(x$timezone), origin = '1970-01-01'
      )
    x
    }
  )
$`1`
# A tibble: 3 x 4
     id  timestamp timezone         new_timestamp
  <dbl>      <int> <chr>            <dttm>
1     1 1540887806 America/New_York 2018-10-30 04:23:26
2     1 1540887806 America/New_York 2018-10-30 04:23:26
3     1 1540887806 America/New_York 2018-10-30 04:23:26

$`2`
# A tibble: 3 x 4
     id  timestamp timezone        new_timestamp
  <dbl>      <int> <chr>           <dttm>
1     2 1540887806 America/Chicago 2018-10-30 03:23:26
2     2 1540887806 America/Chicago 2018-10-30 03:23:26
3     2 1540887806 America/Chicago 2018-10-30 03:23:26

$`3`
# A tibble: 3 x 4
     id  timestamp timezone            new_timestamp
  <dbl>      <int> <chr>               <dttm>
1     3 1540887806 America/Los_Angeles 2018-10-30 01:23:26
2     3 1540887806 America/Los_Angeles 2018-10-30 01:23:26
3     3 1540887806 America/Los_Angeles 2018-10-30 01:23:26

Связывание их в один фрейм данных снова преобразует ссылку в UTC, что тоже НЕ то, что я хочу:

bind_rows(
  lapply(
    split(df, df$id), function(x) {
      x$new_timestamp <- as.POSIXct(
        x$timestamp, tz = unique(x$timezone), origin = '1970-01-01'
        )
      x
      }
    )
  )
# A tibble: 9 x 4
     id  timestamp timezone            new_timestamp
  <dbl>      <int> <chr>               <dttm>
1     1 1540887806 America/New_York    2018-10-30 08:23:26
2     1 1540887806 America/New_York    2018-10-30 08:23:26
3     1 1540887806 America/New_York    2018-10-30 08:23:26
4     2 1540887806 America/Chicago     2018-10-30 08:23:26
5     2 1540887806 America/Chicago     2018-10-30 08:23:26
6     2 1540887806 America/Chicago     2018-10-30 08:23:26
7     3 1540887806 America/Los_Angeles 2018-10-30 08:23:26
8     3 1540887806 America/Los_Angeles 2018-10-30 08:23:26
9     3 1540887806 America/Los_Angeles 2018-10-30 08:23:26

ПРИМЕЧАНИЕ: будет работать как строка символов (использование as.character() вокруг вызова as.POSIXct()). Однако я хочу сохранить тип метки времени для других вычислений в группе.

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