2016-07-19 6 views
0
> df <- data.frame(begin_date = as.Date("2016-01-01") + c(1:10), 
+     term = c(11:20), 
+     term_unit = c(rep("bimonthly", 5), rep("monthly", 5)) 
+    ) 
> df 
    begin_date term term_unit 
1 2016-01-02 11 bimonthly 
2 2016-01-03 12 bimonthly 
3 2016-01-04 13 bimonthly 
4 2016-01-05 14 bimonthly 
5 2016-01-06 15 bimonthly 
6 2016-01-07 16 monthly 
7 2016-01-08 17 monthly 
8 2016-01-09 18 monthly 
9 2016-01-10 19 monthly 
10 2016-01-11 20 monthly 

Ich möchte die Anzahl der Tage in der Laufzeit für jede Zeile berechnen. Das Darlehen beginnt am begin_date und dann macht der Kreditnehmer die Anzahl der monatlichen oder zweimonatlichen Zahlungen in der Begriffspalte. So würde ein Monat nach dem Anfangsdatum die erste geplante monatliche Zahlung stattfinden und die zweite geplante zweimonatliche Zahlung würde eintreten (das erste zweimonatliche Ereignis würde 15 Tage nach dem Anfangsdatum stattfinden).Verwenden Sie R, um die Gesamtzahl der Tage in X Anzahl der zweimonatlichen Zeiträume zu berechnen.

Wenn alle term_units monatlich waren konnte ich die Anzahl der Tage

> library(lubridate) 
df$term_days <- as.integer(df$begin_date %m+% months(df$term) - df$begin_date) 

berechnen Aber ich laufe in Schwierigkeiten, wenn ich versuche und die Anzahl der Tage für die zweimonatlich erscheinende Begriffe zu berechnen.

> df$term_days <- ifelse(df$term_unit == "monthly", as.integer(df$begin_date %m+% months(df$term) - df$begin_date), 
+      ifelse((df$term/2) == floor(df$term/2), as.integer(df$begin_date %m+% months(df$term/2) - df$begin_date), 
+        as.integer(df$begin_date %m+% months(floor(df$term/2)) - df$begin_date +15))) 

gibt den Fehler

Error in validObject(.Object) : 
invalid class “Period” object: periods must have integer values 
+0

ich es geschafft, Es funktioniert, indem man '% m +% months (df $ term/2)' in '% m +% months (floor (df $ term/2))' in der zweiten Zeile ändert. Wenn jemand eine elegantere Lösung hat, würde ich es gerne sehen. – liamvt

Antwort

1

eine geringfügige Änderung an Ihrem Code gemacht:

df$term_days <- ifelse(df$term_unit == "monthly", as.integer(df$begin_date 
%m+% months(df$term) - df$begin_date),ifelse((df$term/2) == floor(df$term/2), 
as.integer(df$begin_date %m+% months(floor(df$term/2)) - df$begin_date), 
as.integer(df$begin_date %m+% months(floor(df$term/2)) - df$begin_date +15))) 

Sie benötigt, um die eine zusätzliche Etage Aussage in der zweiten ifelse

Verwandte Themen