2014-09-02 4 views
4

테스터라는 행렬에 NA 값을 여러 개 보간하고 싶습니다.복수 NA 값 보간 R

ZONEID TIMESTAMP   U10   V10   U100   V100 
1  20121022 12:00 -1.324032e+00 -2.017107e+00 -3.278166e+00 -5.880225574 
1  20121022 13:00 -1.295168e+00   NA -3.130429e+00 -6.414975148 
1  20121022 14:00 -1.285004e+00   NA -3.068829e+00 -7.101699541 
1  20121022 15:00 -9.605904e-01   NA -2.332645e+00 -7.478168285 
1  20121022 16:00 -6.268261e-01 -3.057278e+00 -1.440209e+00 -8.026791079 

I는 zoo 패키지를 설치하고 코드 library(zoo)를 사용했다 : 모든 매트릭스 다른 열 다중도가 744x6에

는 NA 값의 1 열과 테스터의 일부이다. 나는 na.approx 기능을 사용하려고 노력하지만, 선형으로 반환
na.approx(tester) 
# Error ----> need at least two non-NA values to interpolate 

na.approx(tester, rule = 2) 
# Error ----> need at least two non-NA values to interpolate 

na.approx(tester, x = index(tester), na.rm = TRUE, maxgap = Inf) 

은 그 후 내가 시도 :
Lines <- "tester" 
library(zoo) 
z <- read.zoo(textConnection(Lines), index = 2)[,2] 
na.approx(z) 

는 다시 나는 같은 여러 NA 값 오류가 발생했습니다. 나는 또한 시도했다 :

z <- zoo(tester) 
index(Cz) <- Cz[,1] 
Cz_approx <- na.approx(Cz) 

같은 오류.

정말 바보 같은 일을해야합니다.하지만 정말 감사드립니다.

+0

2 값은 회귀선을 형성하고 보간을 허용합니다. 2 미만의 실제 값으로 외삽하는 것은 불가능하다는 것이 수학적 확실성입니다. 당신은 난수 생성기를 사용할 수도 있습니다. 행렬에 NA 값으로만 ​​구성된 변수가 없는지 확인하십시오. 그리고 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example에서 우리가 작업 할 수있는 코드와 테스트 객체를 어떻게 제공하는지 확인하십시오. SO에 오신 것을 환영합니다! –

+0

안녕하세요, Joris, 도와 주셔서 대단히 감사합니다. 선형 보간법이 수학적으로 정당화되지 않는다고 절대적으로 옳습니다. 하지만 난수 생성기가 내 문제를 어떻게 도울 지 확신하지 못합니다. 어떻게 여러개의 NA 값이 이전과 다음 숫자 사이에 있거나 적어도 이전 또는 다음 숫자와 같은 코드를 프로그램 할 수 있습니까? V10 변수가 -2.017 ~ -3.057 사이 인 경우 이걸 도와 줄 수 있니? 고맙습니다. 또한 편집 해 주셔서 감사 드리며, 다음 번에 귀하의 조언을 크게 망치고 읽지 않았 으면합니다. –

+0

[Amelia] (http://cran.r-project.org/web/packages/Amelia/index.html)? – Roland

답변

7

na.approx은 적어도 두 개의 비 - NA 값이있는 열에만 적용 할 수 있습니다. 여기서 부울 행렬에 colSums을 사용하여 관련 열을 찾습니다.

# create a small matrix 
m <- matrix(data = c(NA, 1, 1, 1, 1, 
        NA, NA, 2, NA, NA, 
        NA, NA, NA, NA, 2, 
        NA, NA, NA, 2, 3), 
      ncol = 5, byrow = TRUE) 

m 
#  [,1] [,2] [,3] [,4] [,5] 
# [1,] NA 1 1 1 1 
# [2,] NA NA 2 NA NA 
# [3,] NA NA NA NA 2 
# [4,] NA NA NA 2 3 

library(zoo) 

# na.approx on the entire matrix does not work 
na.approx(m) 
# Error in approx(x[!na], y[!na], xout, ...) : 
# need at least two non-NA values to interpolate 

# find columns with at least two non-NA values 
idx <- colSums(!is.na(m)) > 1 
idx 
# [1] FALSE FALSE TRUE TRUE TRUE 

# interpolate 'TRUE columns' only 
m[ , idx] <- na.approx(m[ , idx]) 
m 
#  [,1] [,2] [,3]  [,4] [,5] 
# [1,] NA 1 1 1.000000 1.0 
# [2,] NA NA 2 1.333333 1.5 
# [3,] NA NA NA 1.666667 2.0 
# [4,] NA NA NA 2.000000 3.0