2017-02-23 4 views
1

Je souhaite définir la valeur NA sur certaines lignes/colonnes dans une trame de données antérieure à une certaine date. Mais chaque colonne a une date/critère différent. Alors, comment cela fonctionnerait-il?Définition de certaines valeurs sur une trame de données en fonction d'un critère de date

Exemple dataframe:

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") 

Alors mon data.frame ressemblerait à ceci:

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

En utilisant les startDate que mes critères, je veux mettre toute valeur avant cette date dans le rapport colonne à NA afin que mon résultat final ressemblerait à ceci:

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

Quelqu'un peut-il m'aider s'il vous plaît? Btw, mon vrai data.frame a environ 20+ colonnes. Ce qui précède est juste un petit exemple de mon problème réel.

Merci d'avance!

Répondre

0

Test cette:

#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

Merci pour cela - cependant, cela ne fonctionnerait pas nécessairement de remplacer avec des zéros NA dans l'étape suivante s'il y a des valeurs après la startDate qui sont nuls, non? – RiddleMeThis

+0

@RiddleMeThis, La sortie devrait être ce que vous voulez maintenant. Pas besoin de convertir en 'NA' à l'étape suivante. –

+1

Je pense qu'il est préférable de ne pas multiplier par m mais de diviser par m à la place. Cela vous donnera des valeurs NaN et Inf que vous pouvez ensuite utiliser quelque chose comme do.call (df, lapply (df, fonction (x) remplacer (x, is.infinite (x), NA))) pour convertir les valeurs en NAs . Merci beaucoup! Cela m'aide vraiment. – RiddleMeThis