2017-02-23 3 views
1

특정 날짜 이전에 발생하는 데이터 프레임 내의 특정 행/열에 값 NA을 설정하려고합니다. 그러나 각 열은 다른 날짜/기준을 가지고 있습니다. 어떻게 작동할까요?특정 날짜를 기준으로 데이터 프레임에 특정 값 설정

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

그래서 내 data.frame은 다음과 같이 보일 것이다 다음 startDate로 내 기준을 사용

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

, 나는 상대적으로 그 이전에 임의의 값을 설정하려면 내

Date  A  B  C 
    01/01/2015 NA  NA NA 
    06/15/2015 2  NA NA 
    11/30/2015 3  6  NA 
와 같이 NA의 열을 입력하면됩니다.누군가 나를 도와 줄 수 있습니까? Btw, 내 실제 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

감사합니다 -하지만, 그것은 반드시 제로인의 startDate 후 값이있는 경우 바로 다음 단계에서 NA와 제로를 대체하기 위해 작동하지 않을 것이다? – RiddleMeThis

+0

@RiddleMeThis, 결과는 원하는 내용이어야합니다. 다음 단계에서 'NA'로 변환 할 필요가 없습니다. –

+1

나는 실제로 m으로 곱하지 않고 대신 m으로 나누는 것이 가장 좋습니다. 그러면 NaN과 Inf 값을 얻을 수 있습니다. 그러면 값을 NA로 변환하기 위해 do.call (df, lapply (df, function (x) replace (x, is.infinite (x), NA))) . 고마워요! 이것은 정말로 나를 도와줍니다. – RiddleMeThis