2017-06-22 5 views
0
mutieren

Ich versuche, die Anzahl der Monate zwischen zwei Daten innerhalb dplyr::mutate aber laufen in den FehlerMit Seq Funktion innerhalb dplyr

Error in mutate_impl(.data, dots) : 'from' must be of length 1 

Gibt es etwas über seq, die mit mutate unvereinbar ist zu berechnen?

library(dplyr) 
dset <- data.frame(f = as.Date(c("2016-03-04","2016-12-13","2017-03-01")) , 
        o = as.Date(c("2016-03-04","2016-12-13","2017-06-02"))) 
dset %>% mutate(y = length(seq(from=f, to=o, by='month')) - 1) 
+0

Was Sie an die Funktion 'seq' übergeben, ist ein Array, das nur einzelne Werte annehmen kann. –

Antwort

2

um es zu umgehen, können Sie entweder sapply oder mapply verwenden. Andernfalls können Sie den Monat aus dem Datum mithilfe von Funktionen in lubridate extrahieren und dann die Differenz berechnen.

library(dplyr) 
library(lubridate) 
# Sapply 
dset %>% 
    mutate(y=sapply(1:length(f), function(i) length(seq(f[i], o[i], by="month")) - 1)) 

# Mapply 
dset %>% 
    mutate(y=mapply(function(x, y) length(seq(x, y, by="month")) - 1, f, o)) 

# function in lubridate 
dset %>% mutate(y=month(o) - month(f)) 
+1

Wenn Sie 'lapply' /' sapply' verwenden, um über Indizes zu iterieren, sollten Sie 'Map' /' mapply' verwenden. – alistaire

+1

Hinzugefügt, um zu antworten. Vielen Dank! – JasonWang

0

Möglicherweise möchten Sie auch dplyr für diesen Einsatz:

dset <- data.frame(f = as.Date(c("2016-03-04","2016-12-13","2017-03-01")) , 
        o = as.Date(c("2016-03-04","2016-12-13","2017-06-02"))) 

dset %>% mutate(y = as.numeric(difftime(f,o, units = "weeks"))/4) 
+0

AH Sie sind richtig. Mea culpa. – akash87

0

Sie gruppieren müssen, iterieren, oder so einstellen, dass jeder from und to Parameter ist die Länge 1 (seq(1, 5) ist in Ordnung; seq(1:2, 5:6) nicht ist), was bedeutet, rowwise oder vielleicht group_by_all:

library(dplyr) 

dset <- data.frame(f = as.Date(c("2016-03-04","2016-12-13","2017-03-01")) , 
        o = as.Date(c("2016-03-04","2016-12-13","2017-06-02"))) 

dset %>% 
    rowwise() %>% 
    mutate(y = length(seq(f, o, by = 'month')) - 1) 

#> Source: local data frame [3 x 3] 
#> Groups: <by row> 
#> 
#> # A tibble: 3 x 3 
#>   f   o  y 
#>  <date>  <date> <int> 
#> 1 2016-03-04 2016-03-04  0 
#> 2 2016-12-13 2016-12-13  0 
#> 3 2017-03-01 2017-06-02  3 
0

"Alistaire" hat einen Tippfehler gemacht, also ist die Antwort falsch

dset %>% 
    rowwise() %>% 
    mutate(y = length(seq(f, o, by = 'month')) - 1) 

Source: local data frame [3 x 3] 
Groups: <by row> 

# A tibble: 3 x 3 
      f   o  y 
     <date>  <date> <dbl> 
1 2016-03-04 2016-03-04  0 
2 2016-12-13 2016-12-13  0 
3 2017-03-01 2017-06-02  3 
Verwandte Themen