2017-03-11 3 views
2

데이터 집합에 누락 값을 입력하려고합니다. 필자는 누락 된 부분을 설명하기 위해 값을 생성 할 수있는 예측 모델을 가지고 있습니다. dfm [is.na (dfm)] < -impute를 사용하여 imputation을 수행하면 값이 열 방향으로 입력됩니다. 그러나 행렬을 전가하여 데이터 행렬을 바꾸어야합니다. 내 질문은 매트릭스를 transposing하지 않고 이것을 수행하는 우아한 방법이 있는가? 여기에 재현 가능한 예제가있는 rcode가 있습니다.누락 된 값을 벡터 행으로 바꿉니다.

 set.seed(1) 
     r=5 
     c=4 
     df<-matrix(runif(r*c), ncol=c) 
     df 
      [,1]  [,2]  [,3]  [,4] 
[1,] 0.2655087 0.89838968 0.2059746 0.4976992 
[2,] 0.3721239 0.94467527 0.1765568 0.7176185 
[3,] 0.5728534 0.66079779 0.6870228 0.9919061 
[4,] 0.9082078 0.62911404 0.3841037 0.3800352 
[5,] 0.2016819 0.06178627 0.7698414 0.7774452 

    d=dim(df) 
    p=0.30 

    #### generate missing data matrix by replacing some values by NAs 
    dfm<-df 
    dfm[matrix(rbinom(prod(d), size=1,prob=p)==1,nrow=d[1])]<-NA 
    dfm 
      [,1]  [,2]  [,3]  [,4] 
[1,]  NA 0.89838968 0.2059746 0.4976992 
[2,] 0.3721239 0.94467527 0.1765568  NA 
[3,] 0.5728534 0.66079779 0.6870228 0.9919061 
[4,] 0.9082078   NA 0.3841037  NA 
[5,] 0.2016819 0.06178627  NA 0.7774452 

    # generate values to impute the missing 
impute<-rgamma(sum(is.na(dfm)),shape=1,scale=0.5) 
    impute 
[1] 0.6804725 0.6029941 0.2770577 0.6035013 0.7812393 

#imputes columnwise 
    dfm[is.na(dfm)]<-impute 
    dfm 
      [,1]  [,2]  [,3]  [,4] 
[1,] 0.6804725 0.89838968 0.2059746 0.4976992 
[2,] 0.3721239 0.94467527 0.1765568 0.6035013 
[3,] 0.5728534 0.66079779 0.6870228 0.9919061 
[4,] 0.9082078 0.60299409 0.3841037 0.7812393 
[5,] 0.2016819 0.06178627 0.2770577 0.7774452 

#impute rowwise 
     tdfm<-t(dfm) 
    tdfm[is.na(tdfm)]<-impute 
    tdfm 
      [,1]  [,2]  [,3]  [,4]  [,5] 
[1,] 0.6804725 0.3721239 0.5728534 0.9082078 0.20168193 
[2,] 0.8983897 0.9446753 0.6607978 0.2770577 0.06178627 
[3,] 0.2059746 0.1765568 0.6870228 0.3841037 0.78123933 
[4,] 0.4976992 0.6029941 0.9919061 0.6035013 0.77744522 

     dfm.fill<-t(tdfm) 
     dfm.fill 

      [,1]  [,2]  [,3]  [,4] 
    [1,] 0.6804725 0.89838968 0.2059746 0.4976992 
    [2,] 0.3721239 0.94467527 0.1765568 0.6029941 
    [3,] 0.5728534 0.66079779 0.6870228 0.9919061 
    [4,] 0.9082078 0.27705769 0.3841037 0.6035013 
    [5,] 0.2016819 0.06178627 0.7812393 0.7774452 
+0

는, 예 재현하기 위해'set.seed'을 사용하십시오. – A5C1D2H2I1M1N2O1R2T1

+0

상기시켜 줘서 고마워. 게시물을 편집했습니다. – user24318

답변

4

사용 which 대신, arr.ind와 함께 당신은 첫 번째 행을 기준으로 정렬 할 수 있도록.

예 : 임의의 숫자를 사용하는 경우

test1 <- matrix(1:12, 3, 4, byrow = TRUE) 
test1[c(1, 3, 8, 6, 10)] <- NA 
test2 <- test1 

impute <- c(-1, -4, -7, -9, -10) 

## What you are currently doing--column-wise 
test1[is.na(test1)] <- impute 
test1 
#  [,1] [,2] [,3] [,4] 
# [1,] -1 2 3 -10 
# [2,] 5 6 -9 8 
# [3,] -4 -7 11 12 

## What it sounds like you want--row-wise 
nas <- which(is.na(test2), arr.ind = TRUE) 
test2[nas[order(nas[, "row"]), ]] <- impute 
test2 
#  [,1] [,2] [,3] [,4] 
# [1,] -1 2 3 -4 
# [2,] 5 6 -7 8 
# [3,] -9 -10 11 12 
+0

@ A5C1D2H2I1M1N2O1R2T1. 행렬에 누락 값이 두 개 이상있는 경우 메서드가 작동합니다. 하지만 1 개가 빠진 경우 작동하지 않습니다. 여기서 오류가 발생합니다. test2 [nas [order (nas [, "row"]),]] <- impute. 코드를 검사 할 때 행과 열의 올바른 색인을 NA와 함께 제공합니다. 그러나 부분 집합에서 실수를하게됩니다. 그 이상한 나는 또한 단지 1 실종과 함께 귀하의 예를 했어 그리고 그 경우에 근무! – user24318

관련 문제