2017-05-12 1 views
0

Ich habe ein date.frame FYE, das Daten enthält, die ich mit einem anderen data.frame, das Datumsangaben enthält, vergleiche. Abmessungen von beiden gleich. Ich definiere dann eine logische Matrix A <- matrix(FYE < DATES, nrow = nrow(FYE), ncol = ncol(FYE)). Für jede Zelle in A mit equals TRUE möchte ich dem entsprechenden Wert in FYE 365 Tage hinzufügen. Ich habe versucht, die folgenden, aber es hat nicht funktioniert:Hinzufügen einer konstanten Anzahl von Tagen nur zu bestimmten Werten eines Datenrahmens, der Daten enthält

A <- matrix(FYE < DATES, nrow = nrow(FYE), 
       ncol = ncol(FYE)) 

    FYE[A == TRUE] <- FYE + 365 

Der Fehlercode ist:

Error in date_next_FYE[A == TRUE] + 365 : 
    non-numeric argument to binary operator 

Vielen Dank für Ihre Hilfe! Dies ist ein ungeradees Ergebnis

Antwort

1

einige Daten erstellen

dates <- seq(as.Date("2016-01-01"), as.Date("2017-06-05"), by="day") 
set.seed(1234) 
FYE <- data.frame(d1=sample(dates, 20), d2=sample(dates, 20), d3=sample(dates, 20)) 
DATES <- data.frame(d1=sample(dates, 20), d2=sample(dates, 20), d3=sample(dates, 20)) 

nun sehen, was die subsetting

str(FYE[FYE < DATES]) 
chr [1:22] "2016-02-29" "2016-11-27" "2016-01-05" "2016-04-29" 

tut. Es scheint, dass die Teilmenge FYE[FYE < DATES] eine Zeichenkette zurückgibt. Diese Extraktion entfernt die Datumsklasse, also müssen Sie sie wieder mit as.Date hinzufügen.

So

FYE[FYE < DATES] <- as.Date(FYE[FYE < DATES]) + 365 

wie gewünscht funktionieren.

Wir können überprüfen, ob Änderungen vorgenommen wurden. Beginnend mit über Originaldaten,

sum(FYE < DATES) 
[1] 22 

FYE[FYE < DATES] <- as.Date(FYE[FYE < DATES]) + 365 

sum(FYE < DATES) 
[1] 4 

Vielleicht noch einmal, für eine gute Maßnahme:

FYE[FYE < DATES] <- as.Date(FYE[FYE < DATES]) + 365 
sum(FYE < DATES) 
[1] 0 
+0

So ist die Klasse entfernt wird, weil er sie als (dimensionslos) Vektoren extrahiert? – Sotos

+0

Dies war eine Überraschung für mich, aber für die Untergruppe 'FYE [FYE lmo

+1

Das macht Sinn. Matrizen können keine Daten halten, denke ich, also ist die logische Matrix in der Tat, was die Klasse (wahrscheinlich) bricht – Sotos

0
library(lubridate) 

ymd("2016-07-01") + days(365) 
Verwandte Themen