2013-12-19 2 views
1

ID 열에 이어 각 ID에 대한 월간 시계열로 구성된 큰 데이터 세트가 있습니다. 이 세트에는 빈번한 누락 값이 있지만 처음부터 0이 아닌 모든 NAs를 첫 번째 0이 아닌 값 앞에 NA로 남겨두고 모든 NAs를 0으로 대체합니다.R 첫 번째 0이 아닌 값 이후에만 NA 변환

예 :

[NA NA NA 1 2 3 NA 4 5 NA] [NA NA NA 1 2 3 0 4 5 0]

너희들이 제공 할 수있는 어떤 도움이나 조언이 많이 주시면 감사하겠습니다로 변경 될 것입니다!

답변

3

쉬운 match() 및 숫자 인덱스를 사용하여해야 할 일 : 숫자 인덱스 에 is.na()에서 논리적 벡터를 변환하는 비 NA 값

  • 사용 which()의를 선두를 찾을 수

    • 사용 match()
    • 그 정보를 사용하여 올바른 위치를 찾을 수 x

    따라서 :

    x <- c(NA,NA,NA,1,2,3,NA,NA,4,5,NA) 
    isna <- is.na(x) 
    nonna <- match(FALSE,isna) 
    id <- which(isna) 
    x[id[id>nonna]] <- 0 
    

    을 제공합니다

    > x 
    [1] NA NA NA 1 2 3 0 0 4 5 0 
    
  • +0

    니스, 정말 우아한 해결책 이잖아! 이것을 데이터 프레임으로 확장하는 방법에 대한 조언이 있습니까? 예. ID가 여러 개인 경우에도 동일한 것입니다. 내가 여러 가지 일을 시도 할 때 "새로운 열은 기존 열 뒤에 구멍이 남습니다"오류가 발생합니다. 고마워, 당신의 솔루션은 지금까지 큰 도움이되었습니다! – masterofimps

    +0

    이것은'replace()'에 잘못된 인덱스를 사용하고 있음을 알려줍니다. 당신이 원하는 것이 분명하지 않습니다. 새로운 질문에 최소한의 예를 제시하고 시도했지만 시도하지 않은 코드를 추가하십시오. 이 링크에 연결했는지 확인하십시오. –

    1

    가 여기에 또 다른 방법입니다. 모두를 0으로 변환 한 후 첫 번째 0을 NA으로 되돌립니다.

    > x <- c(NA,NA,NA,1,2,3,NA,NA,4,5,NA) 
    > x[which(is.na(x))] <- 0 
    ### index from 1 to first element before the first element >0 
    > x[1:min(which(x>0))-1] <- NA 
    > x 
    [1] NA NA NA 1 2 3 0 0 4 5 0 
    

    ### end of vector (elements are >0) 
    > endOfVec <- min(which(x>0)):length(x) 
    > x[endOfVec][is.na(x[endOfVec])] <- 0 
    [1] NA NA NA 1 2 3 0 0 4 5 0 
    
    관련 문제