2017-06-13 1 views
4

J'ai un cadre de date similaire aux données de jouets suivants:Utilisez lubridate pour modifier l'année au sein de la chaîne dplyr

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 est une valeur d'intérêt et year et date sont explicites. Si je veux comparer visuellement value sur plusieurs années, ayant les différentes années date fait le graphique pas très utile

library(tidyverse)  
ggplot(df, aes(date, value, color = as.factor(year))) + 
    geom_line() 

enter image description here

Je peux changer l'année date en utilisant lubridate comme suit, et cela fonctionne

# This works 
library(lubridate) 
df2 <- df 

year(df2$date) <- 2014 

ggplot(df2, aes(date, value, color = as.factor(year))) + 
    geom_line() 

enter image description here

Mais il serait utile de changer cela dans le cadre d'une chaîne dplyr, quelque chose le long des lignes de

df3 <- df %>% 
    mutate(year(date) = 2014) 

Mais ce code renvoie une erreur

Error: unexpected '=' in: "df3 <- df %>% mutate(year(date) ="

est-il un moyen de faire ce travail dans une chaîne dplyr, ou dois-je juste faire cette édition en dehors de la chaîne?

Répondre

5
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 

Ou utilisez do:

df4 <- df %>% 
    do({year(.$date)<-2014; .}) 
df4 
# same results as df3 

all.equal(df2, df4) 
# [1] TRUE 
3

L'affectation est juste un autre appel de fonction, de sorte que vous pouvez faire:

df %>% 
    mutate(date = `year<-`(date, 2014)) 

donne:

# 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