2017-02-23 63 views
1

我想將值NA設置爲在特定日期之前發生的數據幀內的某些行/列。但是每一列都有不同的日期/標準。那麼這將如何工作?根據日期標準將某些值設置爲數據幀

樣品數據框:

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

所以我data.frame應該是這樣的:

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

使用startDate爲我的標準,我想在相對該日期之前設置的任何值列到NA,以便我的最終結果如下所示:

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

有人可以幫我嗎? 順便說一句,我真正的data.frame有大約20 +列。以上只是我實際問題的一個小例子。

在此先感謝!

回答

0

測試此:

#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

感謝這個 - 雖然,它不一定會工作,以取代NA零在下一步如果有爲零的起始日期後的值,對不對? – RiddleMeThis

+0

@RiddleMeThis,輸出應該是你現在想要的。下一步無需轉換爲「NA」。 –

+1

我認爲它最好不乘以m,而是用m除以代替。這會給你NaN和Inf值,然後你可以使用do.call(df,lapply(df,function(x)replace(x,is.infinite(x),NA)))來將值轉換爲NAs 。非常感謝!這真的幫助我。 – RiddleMeThis