gpt4 book ai didi

r - 如何将 lubridate as_datetime 函数与 dplyr mutate 和 case_when 函数结合使用?

转载 作者:行者123 更新时间:2023-12-04 11:50:06 26 4
gpt4 key购买 nike

我试图操纵一个 dttm根据数字 id 向量针对不同时区进行调整的变量。我可以根据 id 操作变量,而不会使用字符向量作为新值。但是,当我尝试使用 date_time() 时创建新值的函数,每个值接收case_when中第一项的结果.

id 向量是数字,我尝试将类转换为因子和字符。问题有关。

library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
library(lubridate)
#>
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#>
#> date

df1 <- tibble(
id = c(1, 2, 3),
date_time = rep(as_datetime("2018-01-01 12:34:56", tz = "Europe/Zurich"), 3)
) %>%
mutate(
date_time2 = case_when(
id == 1 ~ "one",
id == 2 ~ "two",
TRUE ~ "three"
)
)


df2 <- tibble(
id = c(1, 2, 3),
date_time = rep(as_datetime("2018-01-01 12:34:56", tz = "Europe/Zurich"), 3)
) %>%
mutate(
date_time2 = case_when(
id == 1 ~ as_datetime(date_time, tz = "America/New_York"),
id == 2 ~ as_datetime(date_time, tz = "Asia/Kolkata"),
TRUE ~ date_time
)
)

df3 <- tibble(
id = c(1, 2, 3),
date_time = rep(as_datetime("2018-01-01 12:34:56", tz = "Europe/Zurich"), 3)
) %>%
mutate(
date_time2 = case_when(
id == 1 ~ as_datetime(date_time, tz = "Asia/Kolkata"),
id == 2 ~ as_datetime(date_time, tz = "America/New_York"),
TRUE ~ date_time
)
)


df1
#> # A tibble: 3 x 3
#> id date_time date_time2
#> <dbl> <dttm> <chr>
#> 1 1 2018-01-01 12:34:56 one
#> 2 2 2018-01-01 12:34:56 two
#> 3 3 2018-01-01 12:34:56 three

df2
#> # A tibble: 3 x 3
#> id date_time date_time2
#> <dbl> <dttm> <dttm>
#> 1 1 2018-01-01 12:34:56 2018-01-01 06:34:56
#> 2 2 2018-01-01 12:34:56 2018-01-01 06:34:56
#> 3 3 2018-01-01 12:34:56 2018-01-01 06:34:56

df3
#> # A tibble: 3 x 3
#> id date_time date_time2
#> <dbl> <dttm> <dttm>
#> 1 1 2018-01-01 12:34:56 2018-01-01 17:04:56
#> 2 2 2018-01-01 12:34:56 2018-01-01 17:04:56
#> 3 3 2018-01-01 12:34:56 2018-01-01 17:04:56

创建于 2019-03-26 由 reprex package (v0.2.1)
df1显示了我的期望。

df2 , 我期待 date_time2id == 2 显示“2018-01-01 17:04:56”而不是“2018-01-01 06:34:56”。

df3 , 我期待 date_time2id == 3 显示“2018-01-01 12:34:56”而不是“2018-01-01 17:04:56”。

最佳答案

这似乎是一个错误(可能是 dpylr ,因为之前存在日期问题)。

这是一个可能的工作(不要问我为什么会这样:))

tibble(
id = c(1, 2, 3),
date_time = rep(as_datetime("2018-01-01 12:34:56", tz = "Europe/Zurich"), 3)
) %>%
mutate(
date_time2 = case_when(
id == 1 ~ as_datetime(as.character(as_datetime(date_time, tz = "America/New_York"))),
id == 2 ~ as_datetime(as.character(as_datetime(date_time, tz = "Asia/Kolkata"))),
TRUE ~ as_datetime(as.character(date_time))

)
)

# A tibble: 3 x 3
id date_time date_time2
<dbl> <dttm> <dttm>
1 1 2018-01-01 12:34:56 2018-01-01 06:34:56
2 2 2018-01-01 12:34:56 2018-01-01 17:04:56
3 3 2018-01-01 12:34:56 2018-01-01 12:34:56

关于r - 如何将 lubridate as_datetime 函数与 dplyr mutate 和 case_when 函数结合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55352166/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com