Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将lubridate作为_datetime函数与dplyr mutate和case_when函数结合使用?_R_Dplyr_Lubridate - Fatal编程技术网

如何将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
at
id
==2显示“2018-01-01 17:04:56”而不是“2018-01-01 06:34:56”

df3
中,我希望
date\u time2
at
id
==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