如何将lubridate作为_datetime函数与dplyr mutate和case_when函数结合使用?
我试图操纵一个如何将lubridate作为_datetime函数与dplyr mutate和case_when函数结合使用?,r,dplyr,lubridate,R,Dplyr,Lubridate,我试图操纵一个dttm变量,根据数字id向量调整不同的时区。我可以使用字符向量作为新值,根据id操作变量而不会出现问题。但是,当我尝试使用date\u time()函数创建新值时,每个值都会在case\u中的第一个项目出现时收到结果 id向量是数字的,我尝试将类转换为因子和字符。这是一个问题 库(dplyr) #> #>正在附加包:“dplyr” #>以下对象已从“package:stats”屏蔽: #> #>滤波器,滞后 #>以下对象已从“package:base”屏蔽: #> #>相交
dttm
变量,根据数字id向量调整不同的时区。我可以使用字符向量作为新值,根据id操作变量而不会出现问题。但是,当我尝试使用date\u time()
函数创建新值时,每个值都会在case\u中的第一个项目出现时收到结果
id向量是数字的,我尝试将类转换为因子和字符。这是一个问题
库(dplyr)
#>
#>正在附加包:“dplyr”
#>以下对象已从“package:stats”屏蔽:
#>
#>滤波器,滞后
#>以下对象已从“package:base”屏蔽:
#>
#>相交、setdiff、setequal、并集
图书馆(lubridate)
#>
#>附加包装:“lubridate”
#>以下对象已从“package:base”屏蔽:
#>
#>日期
df1%
变异(
日期\时间2=案例\时间(
id==1~“一”,
id==2~“两个”,
真的~“三”
)
)
df2%
变异(
日期\时间2=案例\时间(
id==1~as_datetime(date_time,tz=“美国/纽约”),
id==2~as_datetime(date_time,tz=“亚洲/加尔各答”),
真~日期\时间
)
)
df3%
变异(
日期\时间2=案例\时间(
id==1~as_datetime(date_time,tz=“亚洲/加尔各答”),
id==2~as_datetime(date_time,tz=“美国/纽约”),
真~日期\时间
)
)
df1
#>#tibble:3 x 3
#>id日期\时间日期\时间2
#>
#>2018-01-01 12:34:56一
#>2 2018-01-01 12:34:56两个
#>3 3 2018-01-01 12:34:56三
df2
#>#tibble:3 x 3
#>id日期\时间日期\时间2
#>
#> 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
#>#tibble:3 x 3
#>id日期\时间日期\时间2
#>
#> 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
由(v0.2.1)于2019-03-26创建
df1
显示了我的期望
在df2
中,我希望date\u time2
atid
==2显示“2018-01-01 17:04:56”而不是“2018-01-01 06:34:56”
在df3
中,我希望date\u time2
atid
==3显示“2018-01-01 12:34:56”而不是“2018-01-01 17:04:56”。这似乎是一个bug(可能是dpylr
,因为之前有日期问题)
这里有一个可能的工作(不要问我为什么它工作:))
tibble(
id=c(1,2,3),
日期时间=代表(如日期时间(“2018-01-01 12:34:56”,tz=“欧洲/苏黎世”),3)
) %>%
变异(
日期\时间2=案例\时间(
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))
)
)
#一个tibble:3x3
id日期\时间日期\时间2
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
我们可以使用润滑油
包装中的强制力
。我们可以为tzones
参数提供不同的时区设置。在这种情况下,如果您知道时区的顺序,则不需要使用case\u when
library(dplyr)
library(lubridate)
df2 %>%
mutate(date_time2 = force_tzs(date_time, tzones = c("America/New_York", "Asia/Kolkata", "UTC")))
# # 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:34:56
# 2 2 2018-01-01 12:34:56 2018-01-01 07:04:56
# 3 3 2018-01-01 12:34:56 2018-01-01 12:34:56
df3 %>%
mutate(date_time2 = force_tzs(date_time, tzones = c("Asia/Kolkata", "America/New_York", "UTC")))
# # A tibble: 3 x 3
# id date_time date_time2
# <dbl> <dttm> <dttm>
# 1 1 2018-01-01 12:34:56 2018-01-01 07:04:56
# 2 2 2018-01-01 12:34:56 2018-01-01 17:34:56
# 3 3 2018-01-01 12:34:56 2018-01-01 12:34:56
库(dplyr)
图书馆(lubridate)
df2%>%
变异(日期时间2=力量时间(日期时间,时间=c(“美国/纽约”,“亚洲/加尔各答”,“UTC”))
##tibble:3 x 3
#id日期\时间日期\时间2
#
# 1 1 2018-01-01 12:34:56 2018-01-01 17:34:56
# 2 2 2018-01-01 12:34:56 2018-01-01 07:04:56
# 3 3 2018-01-01 12:34:56 2018-01-01 12:34:56
df3%>%
变异(日期时间2=力量时间(日期时间,时间=c(“亚洲/加尔各答”,“美国/纽约”,“UTC”))
##tibble:3 x 3
#id日期\时间日期\时间2
#
# 1 1 2018-01-01 12:34:56 2018-01-01 07:04:56
# 2 2 2018-01-01 12:34:56 2018-01-01 17:34:56
# 3 3 2018-01-01 12:34:56 2018-01-01 12:34:56
您可以使用id
为时区向量编制索引,以防存在比reprex中更多的值。你知道吗,为什么你得到的是加尔各答的07:04:56
,而不是06:34:56
?这是夏季的问题吗?谢谢。正如@kath所建议的,我有几百个ID,在这种情况下索引是很有用的。然而,下面建议的解决方案非常有效,尽管我很难理解为什么。印度的时区在冬季比CET早4:30,夏季比CET早5:30。
library(dplyr)
library(lubridate)
df2 %>%
mutate(date_time2 = force_tzs(date_time, tzones = c("America/New_York", "Asia/Kolkata", "UTC")))
# # 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:34:56
# 2 2 2018-01-01 12:34:56 2018-01-01 07:04:56
# 3 3 2018-01-01 12:34:56 2018-01-01 12:34:56
df3 %>%
mutate(date_time2 = force_tzs(date_time, tzones = c("Asia/Kolkata", "America/New_York", "UTC")))
# # A tibble: 3 x 3
# id date_time date_time2
# <dbl> <dttm> <dttm>
# 1 1 2018-01-01 12:34:56 2018-01-01 07:04:56
# 2 2 2018-01-01 12:34:56 2018-01-01 17:34:56
# 3 3 2018-01-01 12:34:56 2018-01-01 12:34:56