2017-05-04 3 views
1

J'utilise R 3.4.0 et dplyr 0.5.0 (j'ai aussi testé en utilisant R 3.3.3 et j'ai la même erreur).dplyr group_by erreur de lancement sur la variable pas dans la fonction

J'utilise régulièrement ce type de code dans le passé (même hier!) Mais pour certaines raisons, cela crée une erreur aujourd'hui.

Par exemple, j'ai des données sur un intervalle de 5 minutes que je veux résumer par 15 minutes. Puisque je ne peux pas group_by DateTime POSIXlt, je transforme la variable en caractère. Toutefois, lorsque j'applique la fonction group_by, il crée une erreur sur la variable DateTime originale POSIXlt, même si j'ai utilisé la variable de caractère dans la fonction.

Voici un exemple reproductible:

z <- seq(ISOdatetime(2017,01,01, 00,00,00), ISOdatetime(2017,02,28,23,45,00), by="5 min") 
q <- rnorm(16990, mean=120, sd=75) 

d<- data.frame("Dates"=z, "values"=q) 

# Round the time to the nearest 15min 
d$DatesRound <- as.POSIXlt(round(as.double(d$Dates)/(15*60))*(15*60),origin=(as.POSIXlt('1970-01-01'))) 

# Transform into character 
d$DatesRoundChar <- as.character(d$DatesRound) 

d2 <- 
    d %>% 
    group_by(DatesRoundChar)%>% 
    summarise(total=sum(values)) 

Et voici l'erreur que j'ai:

Erreur dans grouped_df_impl (données, unname (vars), goutte): colonne 'DatesRound' a classe non pris en charge: POSIXlt, POSIXt

J'ai aussi essayé de transformer l'aide:

d$DatesRoundChar <- strftime(as.POSIXct(d$DatesRound)) 
d$DatesRoundChar <- sapply(d$DatesRound, as.character) 

Mais j'ai toujours la même erreur.

Est-ce que quelqu'un sait pourquoi il lance une erreur sur une variable qui n'est même pas dans la fonction? Et comment puis-je le réparer?

Répondre

2

la classe POSIXlt crée le problème dans la chaîne dplyr comme il est un class non pris en charge dans dplyr

d %>% 
    group_by(DatesRoundChar) 

Erreur dans grouped_df_impl (données, unname (vars), drop): Colonne DatesRound: classe non pris en charge POSIXlt/POSIXt

traceback() 
#14: stop(list(message = "Column `DatesRound`: unsupported class POSIXlt/POSIXt", 
#  call = grouped_df_impl(data, unname(vars), drop), cppstack = NULL)) 
#13: .Call("dplyr_grouped_df_impl", PACKAGE = "dplyr", data, symbols, 
#  drop) 
#12: grouped_df_impl(data, unname(vars), drop) 
#11: grouped_df(groups$data, groups$group_names) 
#10: group_by.data.frame(., DatesRoundChar) 
#9: group_by(., DatesRoundChar) 
#8: function_list[[k]](value) 
#7: withVisible(function_list[[k]](value)) 
#6: freduce(value, `_function_list`) 
#5: `_fseq`(`_lhs`) 
#4: eval(expr, envir, enclos) 
#3: eval(quote(`_fseq`(`_lhs`)), env, env) 
#2: withVisible(eval(quote(`_fseq`(`_lhs`)), env, env)) 
#1: d %>% group_by(DatesRoundChar) 

au lieu que nous pouvons changer pour POSIXct avec as.POSIXct

d$DatesRound <- as.POSIXct(round(as.double(d$Dates)/(15*60))* 
        (15*60),origin=(as.POSIXlt('1970-01-01'))) 

ou une autre option est de supprimer la colonne 'DatesRound' avant les group_by

d %>% 
    select(-DatesRound) %>% 
    group_by(DatesRoundChar) %>% 
    summarise(total=sum(values)) 
+1

Merci pour la réponse. En effet, utiliser 'as.POSIXct' fonctionne très bien car il permet de faire exactement ce que je veux avec moins de code. –