2017-02-23 4 views
1

Ich möchte den Wert NA auf bestimmte Zeilen/Spalten innerhalb eines Datenrahmens festlegen, der vor einem bestimmten Datum auftritt. Aber jede Spalte hat ein anderes Datum/andere Kriterien. Wie würde das funktionieren?Festlegen bestimmter Werte für einen Datenrahmen basierend auf einem Datum Kriterien

Beispieldatenrahmen:

dates <- c("01/01/2015", "06/15/2015", "11/30/2015") 
a <- c(1, 2, 3) 
b <- c(2, 4, 6) 
c <- c(3, 5, 9) 
df <- data.frame(Date = dates, A = a, B = b, C = c) 

startDate <- c("02/20/2015", "07/28/2015", "12/01/2015") 

So würde meine data.frame wie folgt aussehen:

Date  A  B  C 
    01/01/2015 1  2  3 
    06/15/2015 2  4  5 
    11/30/2015 3  6  9 

die startDate als meine Kriterien verwenden, möchte ich einen beliebigen Wert setzen vor diesem Zeitpunkt in der relativen Spalte NA so, dass mein Endergebnis würde wie folgt aussehen:

Date  A  B  C 
    01/01/2015 NA  NA NA 
    06/15/2015 2  NA NA 
    11/30/2015 3  6  NA 

Kann mir bitte jemand helfen? Btw, mein realer data.frame hat ungefähr 20+ Spalten. Das obige ist nur ein kleineres Beispiel für mein tatsächliches Problem.

Vielen Dank im Voraus!

Antwort

0

-Test folgt aus:

#Do a pairwise comparison of dates using outer 
m = matrix(
    as.numeric(
     outer(as.Date(as.character(df[,1]), format = "%m/%d/%Y"), 
       as.Date(as.character(startDate), format = "%m/%d/%Y"), ">") 
    ), 
    nrow = nrow(df)) 

m[m == 0] = NA #Set zeroes in m to NA 
df[,2:ncol(df)] = df[,2:ncol(df)] * m #Multiply the columns of df (except 1st) with m 
df 
#  Date A B C 
#1 01/01/2015 NA NA NA 
#2 06/15/2015 2 NA NA 
#3 11/30/2015 3 6 NA 
+0

Dank für diese - aber wäre es nicht unbedingt arbeiten Nullen mit NA im nächsten Schritt zu ersetzen, wenn es Werte nach dem Startdate sind, die Null sind, nicht wahr? – RiddleMeThis

+0

@RiddleMeThis, die Ausgabe sollte sein, was Sie jetzt wollen. Keine Notwendigkeit, im nächsten Schritt zu "NA" zu konvertieren. –

+1

Ich denke, es ist eigentlich am besten, nicht mit m zu multiplizieren, sondern stattdessen mit m zu teilen. Dadurch erhalten Sie NaN- und Inf-Werte, die Sie dann mit do.call (df, lapply (df, Funktion (x) ersetzen (x, is.infinite (x), NA))) umwandeln können, um die Werte in NAs zu konvertieren . Danke vielmals! Das hilft mir wirklich. – RiddleMeThis

Verwandte Themen