Вот кадр данных у меня:
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()
). Однако я хочу сохранить тип метки времени для других вычислений в группе.