2016-05-26 6 views
1

I haben die folgenden Daten-Set, und ich möchte das Monatsintervall für jede Zeile berechnen (einschließlich dem Startmonat und Ende Monat)Wie berechne ich das Monatsintervall in einem Datensatz?

month1 <- c("Jul-96","Aug-96","Sep-96") 
month2 <- c("Jul-97","Sep-97","Nov-97") 

data <- as.data.frame(cbind(month1,month2)) 

I zu den Ergebnissen möchten, wie unten einen Datensatz sein.:

month1 month2 interval 
Jul-96 Jul-97 13 
Aug-96 Sep-97 14 
Sep-96 Nov-97 15 

Vielen Dank.

+0

Was haben Sie versucht? hilft das http://stackoverflow.com/questions/13287798/calculating-days-per-month-between-interval-of-two-dates?rq=1 fyi Sie können 'data' einfach mit' data.frame (Monat1 = c ("Jul-96", "Aug-96", "Sep-96"), Monat2 = c ("Jul-97", "Sep-97", "Nov-97")) ' – rawr

+0

Ich versuchte es dass, aber es scheint, dass ich es in einem Datensatz nicht berechnen konnte. Danke – cyrusjan

Antwort

0

Wir diese und den Unterschied

durch Umwandlung zu yearmon class von zoo tun bekommen könnten
library(zoo) 
12*(as.yearmon(data$month2, '%b-%y')-as.yearmon(data$month1, '%b-%y'))+1 
#[1] 13 14 15 

Oder lapply Schleife über die Spalten verwenden, um yearmon Klasse umwandeln, in der die Differenz der entsprechenden Werte erhalten list Elemente mit Reduce, nehmen Sie die absolute (falls es negativ ist) und die arithmetische wie oben.

abs(Reduce(`-`,lapply(data, as.yearmon, format = '%b-%y')))*12 + 1 
#[1] 13 14 15 
+1

Danke. Es hilft – cyrusjan

1

Es ist nicht allzu hübsch, aber zu einem as.POSIXlt Datetime-Objekt durch Umwandlung, können Sie ein paar einfache Summen dann tun:

with(
    lapply(data, function(x) as.POSIXlt(paste0("01-", x), format="%d-%b-%y", tz="UTC")), 
    (month2$year - month1$year)*12 + month2$mon - month1$mon + 1 
) 
#[1] 13 14 15 
+0

oder 'mit (..., Decke (difftime (month2, memory1)/30))' – rawr