我的日期框架类似于以下玩具数据:
df <- structure(list(year = c(2014, 2014, 2014, 2014, 2014, 2015, 2015,
2015, 2015, 2015, 2016, 2016, 2016, 2016, 2016), date = structure(c(16229,
16236, 16243, 16250, 16257, 16600, 16607, 16614, 16621, 16628,
16964, 16971, 16978, 16985, 16992), class = "Date"), value = c(0.27,
0.37, 0.57, 0.91, 0.2, 0.9, 0.94, 0.66, 0.63, 0.06, 0.21, 0.18,
0.69, 0.38, 0.77)), .Names = c("year", "date", "value"), row.names = c(NA,
-15L), class = c("tbl_df", "tbl", "data.frame"))
其中value
是一些感兴趣的值,year
和date
是不言自明的。如果我想在多年内对value
进行直观比较,那么date
中的不同年份会使图表不太有用
library(tidyverse)
ggplot(df, aes(date, value, color = as.factor(year))) +
geom_line()
我可以使用date
更改lubridate
中的年份,如下所示,这可行
# This works
library(lubridate)
df2 <- df
year(df2$date) <- 2014
ggplot(df2, aes(date, value, color = as.factor(year))) +
geom_line()
但是将此更改为dplyr
链的一部分会有所帮助,这与
df3 <- df %>%
mutate(year(date) = 2014)
但该代码返回错误
错误:意外&#39; =&#39; in:&#34; df3&lt; - df%&gt;%mutate(年(日期)=&#34;
有没有办法让这个工作在dplyr
链中,或者我只是需要在链外做这个编辑?
答案 0 :(得分:6)
df3 <- df %>%
mutate(date=ymd(format(df$date, "2014-%m-%d")))
df3
# # A tibble: 15 x 3
# year date value
# <dbl> <date> <dbl>
# 1 2014 2014-06-08 0.27
# 2 2014 2014-06-15 0.37
# 3 2014 2014-06-22 0.57
# 4 2014 2014-06-29 0.91
# 5 2014 2014-07-06 0.20
# 6 2015 2014-06-14 0.90
# 7 2015 2014-06-21 0.94
# 8 2015 2014-06-28 0.66
# 9 2015 2014-07-05 0.63
# 10 2015 2014-07-12 0.06
# 11 2016 2014-06-12 0.21
# 12 2016 2014-06-19 0.18
# 13 2016 2014-06-26 0.69
# 14 2016 2014-07-03 0.38
# 15 2016 2014-07-10 0.77
all.equal(df2, df3)
# [1] TRUE
或使用do
:
df4 <- df %>%
do({year(.$date)<-2014; .})
df4
# same results as df3
all.equal(df2, df4)
# [1] TRUE
答案 1 :(得分:5)
赋值只是另一个函数调用,所以你可以这样做:
df %>%
mutate(date = `year<-`(date, 2014))
给出:
# A tibble: 15 x 3 year date value <dbl> <date> <dbl> 1 2014 2014-06-08 0.27 2 2014 2014-06-15 0.37 3 2014 2014-06-22 0.57 4 2014 2014-06-29 0.91 5 2014 2014-07-06 0.20 6 2015 2014-06-14 0.90 7 2015 2014-06-21 0.94 8 2015 2014-06-28 0.66 9 2015 2014-07-05 0.63 10 2015 2014-07-12 0.06 11 2016 2014-06-12 0.21 12 2016 2014-06-19 0.18 13 2016 2014-06-26 0.69 14 2016 2014-07-03 0.38 15 2016 2014-07-10 0.77