[R] 결측값(NA) 제거, 대체 방법

: ) YOUNG·2021년 12월 3일
2

빅분기

목록 보기
9/20
post-thumbnail

결측값 (NA)

결측값 확인하기

결측값을 제거하기 위해서는 미리 결측값의 갯수와 결측값이 포함되어 있는 컬럼을 아는 것이 중요합니다.

data(airquality)
main <- airquality

방법1. colSums() 사용하기

colSums(is.na(main))
> colSums(is.na(main))
  Ozone Solar.R    Wind    Temp   Month     Day
     37       7       0       0       0       0



방법2. sapply() 사용하기

sapply(main, function(x) {
    sum(is.na(x))
})
> sapply(main, function(x) {
+     sum(is.na(x))
+ })
  Ozone Solar.R    Wind    Temp   Month     Day
     37       7       0       0       0       0
>




제거

데이터셋 전체 결측값 제거하기

library(mlbench)
data(PimaIndiansDiabetes2)
main <- PimaIndiansDiabetes2

colSums(is.na(main))
> colSums(is.na(main))
pregnant  glucose pressure  triceps  insulin     mass pedigree      age
       0        5       35      227      374       11        0        0
diabetes
       0



가장 흔한 na.omit() 사용하기

main <- na.omit(main)
colSums(is.na(main)
> colSums(is.na(main))
pregnant  glucose pressure  triceps  insulin     mass pedigree      age
       0        0        0        0        0        0        0        0
diabetes
       0



complete.cases 사용하기

main <- main[complete.cases(main), ]
colSums(is.na(main))
> colSums(is.na(main))
pregnant  glucose pressure  triceps  insulin     mass pedigree      age
       0        0        0        0        0        0        0        0
diabetes
       0



특정 컬럼을 선택하여 결측값 제거하기

파이프 연산자(%>%) 사용하기

정확히 말하자면, 제거를 하는 것이 아닌 특정 컬럼의 결측값을 제외한 나머지를 선택하는 방법입니다.

library(mlbench)
data(PimaIndiansDiabetes2)
main <- PimaIndiansDiabetes2
colSums(is.na(main))
> colSums(is.na(main))
pregnant  glucose pressure  triceps  insulin     mass pedigree      age
       0        5       35      227      374       11        0        0
diabetes
       0

main <- main %>% filter( !is.na(pressure) )
colSums(is.na(main))
pregnant  glucose pressure  triceps  insulin     mass pedigree      age
       0        5        0      194      339        4        0        0
diabetes
       0




대체

결측값에 직접 값 넣기

mass, pressure컬럼의 결측값을 각 컬럼의 중앙값으로 대체

결측값 수 미리 확인

library(mlbench)
data(PimaIndiansDiabetes2)
main <- PimaIndiansDiabetes2

colSums(is.na(main))
> colSums(is.na(main))
pregnant  glucose pressure  triceps  insulin     mass pedigree      age
       0        5       35      227      374       11        0        0
diabetes
       0

중앙값 미리 생성

gme <- median(main$glucose, na.rm = T)  # glucose의 중앙값
mme <- median(main$mass, na.rm = T) # mass의 중앙값


> gme
[1] 117
> mme
[1] 32.3

glucose컬럼의 결측값 확인

head(main$glucose, 100)
> head(main$glucose, 100)
  [1] 148  85 183  89 137 116  78 115 197 125 110 168 139 189 166 100 118 107
 [19] 103 115 126  99 196 119 143 125 147  97 145 117 109 158  88  92 122 103
 [37] 138 102  90 111 180 133 106 171 159 180 146  71 103 105 103 101  88 176
 [55] 150  73 187 100 146 105  84 133  44 141 114  99 109 109  95 146 100 139
 [73] 126 129  79  NA  62  95 131 112 113  74  83 101 137 110 106 100 136 107
 [91]  80 123  81 134 142 144  92  71  93 122

main$glucose[is.na(main$glucose) ] <- gme

head(main$glucose, 100)
main$glucose[76]
> head(main$glucose, 100)
  [1] 148  85 183  89 137 116  78 115 197 125 110 168 139 189 166 100 118 107
 [19] 103 115 126  99 196 119 143 125 147  97 145 117 109 158  88  92 122 103
 [37] 138 102  90 111 180 133 106 171 159 180 146  71 103 105 103 101  88 176
 [55] 150  73 187 100 146 105  84 133  44 141 114  99 109 109  95 146 100 139
 [73] 126 129  79 117  62  95 131 112 113  74  83 101 137 110 106 100 136 107
 [91]  80 123  81 134 142 144  92  71  93 122
> main$glucose[76]
[1] 117

glucose 컬럼의 중앙값인 gme인 117로 대체된 모습을 확인할 수 있습니다.



방법2. impute() 함수

impute함수를 사용하면 위 방법보다 훨씬 간단하게 결측값을 원하는 값으로 대체 가능합니다.

혹시나 이 방법을 보시는 분 중 빅분기를 준비중이시라면 이 방법은 추천드리지 않습니다.

impute함수는 Hmisc라이브러리를 사용하는데, Hmisc라이브러리는 시험장에서 사용할 수 없기때문입니다.

install.pacakages("Hmisc")
library(Hmisc)
head(main$mass, 100)
> head(main$mass, 100)
  [1] 33.6 26.6 23.3 28.1 43.1 25.6 31.0 35.3 30.5   NA 37.6 38.0 27.1 30.1 25.8
 [16] 30.0 45.8 29.6 43.3 34.6 39.3 35.4 39.8 29.0 36.6 31.1 39.4 23.2 22.2 34.1
 [31] 36.0 31.6 24.8 19.9 27.6 24.0 33.2 32.9 38.2 37.1 34.0 40.2 22.7 45.4 27.4
 [46] 42.0 29.7 28.0 39.1   NA 19.4 24.2 24.4 33.7 34.7 23.0 37.7 46.8 40.5 41.5
 [61]   NA 32.9 25.0 25.4 32.8 29.0 32.5 42.7 19.6 28.9 32.9 28.6 43.4 35.1 32.0
 [76] 24.7 32.6 37.7 43.2 25.0 22.4   NA 29.3 24.6 48.8 32.4 36.6 38.5 37.1 26.5
 [91] 19.1 32.0 46.7 23.8 24.7 33.9 31.6 20.4 28.7 49.7
 

library(Hmisc)
main$mass <- impute(main$mass, mme)
head(main$mass, 100)
> head(main$mass, 100)
  [1] 33.6  26.6  23.3  28.1  43.1  25.6  31.0  35.3  30.5  32.3* 37.6  38.0
 [13] 27.1  30.1  25.8  30.0  45.8  29.6  43.3  34.6  39.3  35.4  39.8  29.0
 [25] 36.6  31.1  39.4  23.2  22.2  34.1  36.0  31.6  24.8  19.9  27.6  24.0
 [37] 33.2  32.9  38.2  37.1  34.0  40.2  22.7  45.4  27.4  42.0  29.7  28.0
 [49] 39.1  32.3* 19.4  24.2  24.4  33.7  34.7  23.0  37.7  46.8  40.5  41.5 
 [61] 32.3* 32.9  25.0  25.4  32.8  29.0  32.5  42.7  19.6  28.9  32.9  28.6
 [73] 43.4  35.1  32.0  24.7  32.6  37.7  43.2  25.0  22.4  32.3* 29.3  24.6
 [85] 48.8  32.4  36.6  38.5  37.1  26.5  19.1  32.0  46.7  23.8  24.7  33.9
 [97] 31.6  20.4  28.7  49.7
 

head출력 결과에서 *이 붙은 곳을 보면 NA였던 자리인데, 현재 mass의 중앙값인 mme로 대체 된것을 확인할 수 있습니다

참고로 *은 제가 붙여준것이 아닌 impute함수를 사용하면 자동으로 표시 됩니다. 실제로 데이터에 붙은것은 아니기때문에 문제가 되지 않습니다.


또한 여기서는 중앙값을 미리 계산해서 넣어줬지만,

main$pressure <- impute(main$pressure, median)

그냥 impute옵션으로 median이나 mean 명령어를 줘서 중앙값, 평균으로도 곧바로 대체가 가능합니다. 사실상 가장 편한 대체 방법인 것 같습니다.



방법3. for문과 if문 사용하기

혹시 빅분기 시험 중 다른 함수나 방법이 생각나지 않는다면, 코드는 길지만 가장 원시적인 for문과 if문을 사용해도 괜찮은 방법입니다.

head(main$insulin, 100)
> head(main$insulin, 100)
  [1]  NA  NA  NA  94 168  NA  88  NA 543  NA  NA  NA  NA 846 175  NA 230  NA
 [19]  83  96 235  NA  NA  NA 146 115  NA 140 110  NA  NA 245  54  NA  NA 192
 [37]  NA  NA  NA 207  70  NA  NA 240  NA  NA  NA  NA  NA  NA  82  36  23 300
 [55] 342  NA 304 110  NA 142  NA  NA  NA 128  NA  NA  NA  NA  38 100  90 140
 [73]  NA 270  NA  NA  NA  NA  NA  NA  NA  NA  71  NA  NA 125  NA  71 110  NA
 [91]  NA 176  48  NA  64 228  NA  76  64 220

insulin의 결측값을 100으로 대체

n <- nrow(main)
for(i in 1:n) {
    if(  is.na(main$insulin[i])  ) {
        main$insulin[i] <- 100
    }
}

head(main$insulin, 100)
> head(main$insulin, 100)
  [1] 100 100 100  94 168 100  88 100 543 100 100 100 100 846 175 100 230 100
 [19]  83  96 235 100 100 100 146 115 100 140 110 100 100 245  54 100 100 192
 [37] 100 100 100 207  70 100 100 240 100 100 100 100 100 100  82  36  23 300
 [55] 342 100 304 110 100 142 100 100 100 128 100 100 100 100  38 100  90 140
 [73] 100 270 100 100 100 100 100 100 100 100  71 100 100 125 100  71 110 100
 [91] 100 176  48 100  64 228 100  76  64 220



방법4. fill함수 사용하기

library(tidyr)의 fill 함수를 사용하면 결측값을 위 아래의 값으로 대체 할 수 있습니다.

결측값 대체 전


> colSums(is.na(main))
pregnant  glucose pressure  triceps  insulin     mass pedigree      age
       0        5       35      227      374       11        0        0
diabetes
       0
       
       

> head(main$insulin, 100)
  [1]  NA  NA  NA  94 168  NA  88  NA 543  NA  NA  NA  NA 846 175  NA 230  NA
 [19]  83  96 235  NA  NA  NA 146 115  NA 140 110  NA  NA 245  54  NA  NA 192
 [37]  NA  NA  NA 207  70  NA  NA 240  NA  NA  NA  NA  NA  NA  82  36  23 300
 [55] 342  NA 304 110  NA 142  NA  NA  NA 128  NA  NA  NA  NA  38 100  90 140
 [73]  NA 270  NA  NA  NA  NA  NA  NA  NA  NA  71  NA  NA 125  NA  71 110  NA
 [91]  NA 176  48  NA  64 228  NA  76  64 220

fill 함수 적용


main <- main %>% fill(insulin, .direction = 'updown')
colSums(is.na(main))
head(main$insulin, 100)

> colSums(is.na(main))


pregnant  glucose pressure  triceps  insulin     mass pedigree      age
       0        5       35      227        0       11        0        0
diabetes
       0
       
       
> head(main$insulin, 100)
  [1]  94  94  94  94 168  88  88 543 543 846 846 846 846 846 175 230 230  83
 [19]  83  96 235 146 146 146 146 115 140 140 110 245 245 245  54 192 192 192
 [37] 207 207 207 207  70 240 240 240  82  82  82  82  82  82  82  36  23 300
 [55] 342 304 304 110 142 142 128 128 128 128  38  38  38  38  38 100  90 140
 [73] 270 270  71  71  71  71  71  71  71  71  71 125 125 125  71  71 110 176
 [91] 176 176  48  64  64 228  76  76  64 220

결측값이 있을 때의 자료와 바뀐 후의 자료를 잘비교해보시면 어떤 함수인지 바로 감을 잡으실 수 있으실 겁니다.

NA가1 ~ 3 까지 있고 94부터 값이 있습니다 이 경우는 up을 기준으로 94의 값을 채워주었습니다.

fill함수의 .direciton 옵션은 'up', 'down', 'updown', 'downup'의 4가지 옵션이 있으니 선택하시면 됩니다. 단, 'up', 'down'은 애매하게 첫번째나 마지막에 결측값이 있을 경우, 결측값 처리가 되지 않을 수도 있으니, 저는 'updown'이나 'downup'을 추천드립니다.


보통 이 방법은 factor형의 자료구조에 결측값이 있을 때 채우는 방식인데,
여기서는 그냥 보여드리기 위해서 num타입의 결측값을 처리해 보았습니다. 특정 용도가 있을 때 사용하는 방법이니 본인이 잘 선택해서 사용하시면 될 것 같습니다.




번외

결측값의 범위를 지정하기

대게 NA가 결측값이긴 하지만, 그냥 빈칸인 ""이나 무작정 어떤 값이 결측값으로 지정될 수 도 있습니다.

이럴 때는 조금 야매이긴 하지만 방법이 있습니다.

예를 들어 csv파일을 읽어와서 데이터 셋으로 만든다고 했을 때 입니다.

main <- read.csv(
    file = 'Loan.csv',
    fileEncoding = 'UTF-8-BOM',
)

해당 csv파일을 main 데이터 셋으로 불러왔을 경우
결측값을 확인해보면,

> colSums(is.na(main))
       Loan_ID    loan_status      Principal          terms effective_date
             0              0              0              0              0
      due_date  paid_off_time  past_due_days            age      education
             0              0            300              0              0
        Gender
             0

past_due_days 컬럼의 결측값 300개를 제외하고는 결측값이 하나도 없습니다.


하지만, paid_off_time 컬럼을 한번 열어봤을 때,

main$paid_off_time
> main$paid_off_time

... 생략
[201] 9/20/2016 8:26   10/11/2016 23:00 9/24/2016 20:47  9/26/2016 16:00
[205] 10/11/2016 9:01  9/16/2016 14:52  11/10/2016 13:00 10/9/2016 10:00
[209] 9/12/2016 14:40  10/11/2016 16:00 9/23/2016 21:58  10/8/2016 18:48
[213] 10/10/2016 16:41 10/11/2016 13:01 9/16/2016 2:34   11/10/2016 16:00
[217] 9/21/2016 8:11   9/26/2016 9:00   9/26/2016 13:00  10/11/2016 13:01
[221] 9/26/2016 23:00  10/11/2016 9:01  11/10/2016 13:00 9/26/2016 23:00
[225] 10/9/2016 10:00  10/11/2016 13:01 9/23/2016 14:01  9/25/2016 13:29
[229] 9/25/2016 14:50  9/26/2016 9:00   10/26/2016 9:00  9/25/2016 9:01
[233] 10/8/2016 15:35  10/11/2016 16:01 9/26/2016 19:35  10/9/2016 21:28
[237] 10/7/2016 16:45  9/24/2016 12:13  10/11/2016 9:01  9/14/2016 23:02
[241] 10/8/2016 11:03  9/26/2016 9:00   9/26/2016 23:00  9/25/2016 19:31
[245] 9/14/2016 19:48  10/12/2016 23:00 9/25/2016 12:48  9/26/2016 21:18
[249] 10/7/2016 10:22  9/26/2016 6:17   9/22/2016 16:57  10/9/2016 21:57
[253] 10/4/2016 12:59  9/17/2016 20:51  10/12/2016 23:00 10/8/2016 15:51 
[257] 9/27/2016 9:00   9/27/2016 9:00   9/16/2016 15:57  10/12/2016 9:00
[261] 9/26/2016 7:48   9/21/2016 16:53  10/11/2016 0:29  9/25/2016 10:37
[265] 9/27/2016 13:00  9/26/2016 15:10  9/24/2016 12:46  9/28/2016 9:00
[269] 10/13/2016 9:00  10/6/2016 12:09  10/14/2016 11:03 10/8/2016 17:12
[273] 11/12/2016 9:00  10/13/2016 9:00  10/13/2016 13:00 9/27/2016 15:52
[277] 9/28/2016 13:00  10/13/2016 9:00  9/15/2016 0:43   10/10/2016 10:25
[281] 9/27/2016 20:41  9/28/2016 9:00   10/6/2016 6:51   10/12/2016 6:25
[285] 9/27/2016 22:50  11/12/2016 9:00  10/12/2016 12:30 10/12/2016 3:49
[289] 10/13/2016 13:00 9/27/2016 7:48   9/22/2016 9:28   10/11/2016 16:33
[293] 9/18/2016 16:56  10/13/2016 9:00  10/13/2016 13:00 10/13/2016 13:00
[297] 9/21/2016 4:42   10/13/2016 9:00  10/13/2016 9:00  10/13/2016 11:00
[301]
[305]
[309]
[313]
[317]
[321]
[325]
[329]
[333]
[337]
[341]
[345]
[349]
[353]
[357]
[361]
[365]
[369]
[373]
[377]
[381]
[385]
[389]
[393]
[397]
[401] 10/10/2016 11:45 9/27/2016 17:00  11/20/2016 14:10 9/28/2016 15:38
[405] 9/26/2016 17:22  10/21/2016 14:00 9/26/2016 11:03  11/5/2016 15:39
[409] 11/22/2016 15:53 9/29/2016 10:30  10/10/2016 15:18 11/5/2016 10:49 
[413] 9/27/2016 17:10  9/26/2016 11:35  10/12/2016 9:59  9/27/2016 17:14
[417] 10/11/2016 12:45 9/28/2016 11:38  10/7/2016 13:21  11/4/2016 15:37
[421] 9/28/2016 17:39  10/12/2016 9:52  9/29/2016 15:12  10/12/2016 11:17
[425] 11/10/2016 22:58 11/3/2016 15:23  10/11/2016 16:44 10/11/2016 11:02
[429] 10/12/2016 13:17 10/11/2016 17:22 9/28/2016 14:02  9/29/2016 13:42
[433] 9/19/2016 15:00  10/12/2016 14:32 10/11/2016 11:33 10/11/2016 16:27
[437] 11/15/2016 15:27 10/11/2016 16:13 10/17/2016 10:06 11/14/2016 13:15
[441] 10/24/2016 16:20 9/27/2016 16:35  10/11/2016 11:48 11/7/2016 19:21
[445] 10/12/2016 16:22 9/27/2016 17:24  11/4/2016 11:07  11/2/2016 9:39
[449] 10/13/2016 18:18 10/11/2016 11:29 10/13/2016 16:27 9/29/2016 11:19 
[453] 9/28/2016 11:17  10/14/2016 11:04 10/17/2016 17:40 9/28/2016 9:42
[457] 11/18/2016 15:52 10/30/2016 14:19 10/13/2016 15:10 9/28/2016 13:36
[461] 9/28/2016 15:34  11/17/2016 11:55 11/15/2016 18:51 9/30/2016 10:23
[465] 11/11/2016 17:17 10/12/2016 12:54 10/15/2016 9:48  10/27/2016 11:14
[469] 10/15/2016 14:14 12/2/2016 9:45   9/28/2016 15:02  11/4/2016 14:46
[473] 11/16/2016 12:12 10/14/2016 19:02 9/28/2016 11:34  11/9/2016 18:12
[477] 10/31/2016 13:07 10/20/2016 17:38 11/7/2016 8:55   10/12/2016 18:26
[481] 10/25/2016 13:44 9/29/2016 15:07  9/27/2016 11:40  10/18/2016 19:08
[485] 10/15/2016 9:23  10/14/2016 10:07 11/21/2016 11:36 10/13/2016 12:02
[489] 10/9/2016 19:30  10/12/2016 18:04 10/17/2016 10:53 11/9/2016 13:41
[493] 10/25/2016 17:44 9/29/2016 12:45  10/13/2016 14:45 10/14/2016 19:08
[497] 10/10/2016 20:02 9/29/2016 11:49  11/11/2016 22:40 10/19/2016 11:58
321 Levels:  10/1/2016 10:18 10/1/2016 16:48 ... 9/9/2016 13:45

301번 부터 보면, 그냥 값이 전부 입력되지 않았습니다.
이럼에도 불구하고, colSums(is.na())를 사용해서 확인해보면 우리는 결측값으로 확인할 수 없습니다.
이럴 때 결측값의 기준을 정해서 범위를 지정해 줄 수 있는데, na.strings 옵션을 넣어주면 됩니다.



다시 한번 read.csv를 실행해보겠습니다
저는 "" (빈칸), "na", "NA"를 결측값으로 지정한다는 설정을 넣어줬습니다.


main <- read.csv(
    file = 'Loan.csv',
    fileEncoding = 'UTF-8-BOM',
    stringsAsFactor = TRUE,
    na.strings = c("", "na", "NA")
)

colSums(is.na(main))
> colSums(is.na(main))
       Loan_ID    loan_status      Principal          terms effective_date
             0              0              0              0              0
      due_date  paid_off_time  past_due_days            age      education
             0            100            300              0              0
        Gender
             0

이번에는 아까와 다르게 paid_off_time에도 결측값의 개수가 제대로 파악이 됩니다.


> main$paid_off_time

... 생략
[201] 9/20/2016 8:26   10/11/2016 23:00 9/24/2016 20:47  9/26/2016 16:00
[205] 10/11/2016 9:01  9/16/2016 14:52  11/10/2016 13:00 10/9/2016 10:00
[209] 9/12/2016 14:40  10/11/2016 16:00 9/23/2016 21:58  10/8/2016 18:48
[213] 10/10/2016 16:41 10/11/2016 13:01 9/16/2016 2:34   11/10/2016 16:00
[217] 9/21/2016 8:11   9/26/2016 9:00   9/26/2016 13:00  10/11/2016 13:01
[221] 9/26/2016 23:00  10/11/2016 9:01  11/10/2016 13:00 9/26/2016 23:00
[225] 10/9/2016 10:00  10/11/2016 13:01 9/23/2016 14:01  9/25/2016 13:29
[229] 9/25/2016 14:50  9/26/2016 9:00   10/26/2016 9:00  9/25/2016 9:01
[233] 10/8/2016 15:35  10/11/2016 16:01 9/26/2016 19:35  10/9/2016 21:28
[237] 10/7/2016 16:45  9/24/2016 12:13  10/11/2016 9:01  9/14/2016 23:02
[241] 10/8/2016 11:03  9/26/2016 9:00   9/26/2016 23:00  9/25/2016 19:31
[245] 9/14/2016 19:48  10/12/2016 23:00 9/25/2016 12:48  9/26/2016 21:18
[249] 10/7/2016 10:22  9/26/2016 6:17   9/22/2016 16:57  10/9/2016 21:57 
[253] 10/4/2016 12:59  9/17/2016 20:51  10/12/2016 23:00 10/8/2016 15:51
[257] 9/27/2016 9:00   9/27/2016 9:00   9/16/2016 15:57  10/12/2016 9:00
[261] 9/26/2016 7:48   9/21/2016 16:53  10/11/2016 0:29  9/25/2016 10:37
[265] 9/27/2016 13:00  9/26/2016 15:10  9/24/2016 12:46  9/28/2016 9:00
[269] 10/13/2016 9:00  10/6/2016 12:09  10/14/2016 11:03 10/8/2016 17:12
[273] 11/12/2016 9:00  10/13/2016 9:00  10/13/2016 13:00 9/27/2016 15:52
[277] 9/28/2016 13:00  10/13/2016 9:00  9/15/2016 0:43   10/10/2016 10:25
[281] 9/27/2016 20:41  9/28/2016 9:00   10/6/2016 6:51   10/12/2016 6:25
[285] 9/27/2016 22:50  11/12/2016 9:00  10/12/2016 12:30 10/12/2016 3:49
[289] 10/13/2016 13:00 9/27/2016 7:48   9/22/2016 9:28   10/11/2016 16:33
[293] 9/18/2016 16:56  10/13/2016 9:00  10/13/2016 13:00 10/13/2016 13:00
[297] 9/21/2016 4:42   10/13/2016 9:00  10/13/2016 9:00  10/13/2016 11:00
[301] <NA>             <NA>             <NA>             <NA>
[305] <NA>             <NA>             <NA>             <NA>
[309] <NA>             <NA>             <NA>             <NA>
[313] <NA>             <NA>             <NA>             <NA>
[317] <NA>             <NA>             <NA>             <NA>
[321] <NA>             <NA>             <NA>             <NA>
[325] <NA>             <NA>             <NA>             <NA>
[329] <NA>             <NA>             <NA>             <NA>
[333] <NA>             <NA>             <NA>             <NA>            
[337] <NA>             <NA>             <NA>             <NA>
[341] <NA>             <NA>             <NA>             <NA>
[345] <NA>             <NA>             <NA>             <NA>
[349] <NA>             <NA>             <NA>             <NA>
[353] <NA>             <NA>             <NA>             <NA>
[357] <NA>             <NA>             <NA>             <NA>
[361] <NA>             <NA>             <NA>             <NA>
[365] <NA>             <NA>             <NA>             <NA>
[369] <NA>             <NA>             <NA>             <NA>
[373] <NA>             <NA>             <NA>             <NA>
[377] <NA>             <NA>             <NA>             <NA>
[381] <NA>             <NA>             <NA>             <NA>
[385] <NA>             <NA>             <NA>             <NA>
[389] <NA>             <NA>             <NA>             <NA>
[393] <NA>             <NA>             <NA>             <NA>
[397] <NA>             <NA>             <NA>             <NA>
[401] 10/10/2016 11:45 9/27/2016 17:00  11/20/2016 14:10 9/28/2016 15:38 
[405] 9/26/2016 17:22  10/21/2016 14:00 9/26/2016 11:03  11/5/2016 15:39
[409] 11/22/2016 15:53 9/29/2016 10:30  10/10/2016 15:18 11/5/2016 10:49
[413] 9/27/2016 17:10  9/26/2016 11:35  10/12/2016 9:59  9/27/2016 17:14
[417] 10/11/2016 12:45 9/28/2016 11:38  10/7/2016 13:21  11/4/2016 15:37
[421] 9/28/2016 17:39  10/12/2016 9:52  9/29/2016 15:12  10/12/2016 11:17
[425] 11/10/2016 22:58 11/3/2016 15:23  10/11/2016 16:44 10/11/2016 11:02
[429] 10/12/2016 13:17 10/11/2016 17:22 9/28/2016 14:02  9/29/2016 13:42
[433] 9/19/2016 15:00  10/12/2016 14:32 10/11/2016 11:33 10/11/2016 16:27
[437] 11/15/2016 15:27 10/11/2016 16:13 10/17/2016 10:06 11/14/2016 13:15
[441] 10/24/2016 16:20 9/27/2016 16:35  10/11/2016 11:48 11/7/2016 19:21
[445] 10/12/2016 16:22 9/27/2016 17:24  11/4/2016 11:07  11/2/2016 9:39
[449] 10/13/2016 18:18 10/11/2016 11:29 10/13/2016 16:27 9/29/2016 11:19
[453] 9/28/2016 11:17  10/14/2016 11:04 10/17/2016 17:40 9/28/2016 9:42
[457] 11/18/2016 15:52 10/30/2016 14:19 10/13/2016 15:10 9/28/2016 13:36
[461] 9/28/2016 15:34  11/17/2016 11:55 11/15/2016 18:51 9/30/2016 10:23
[465] 11/11/2016 17:17 10/12/2016 12:54 10/15/2016 9:48  10/27/2016 11:14
[469] 10/15/2016 14:14 12/2/2016 9:45   9/28/2016 15:02  11/4/2016 14:46
[473] 11/16/2016 12:12 10/14/2016 19:02 9/28/2016 11:34  11/9/2016 18:12
[477] 10/31/2016 13:07 10/20/2016 17:38 11/7/2016 8:55   10/12/2016 18:26
[481] 10/25/2016 13:44 9/29/2016 15:07  9/27/2016 11:40  10/18/2016 19:08
[485] 10/15/2016 9:23  10/14/2016 10:07 11/21/2016 11:36 10/13/2016 12:02
[489] 10/9/2016 19:30  10/12/2016 18:04 10/17/2016 10:53 11/9/2016 13:41
[493] 10/25/2016 17:44 9/29/2016 12:45  10/13/2016 14:45 10/14/2016 19:08
[497] 10/10/2016 20:02 9/29/2016 11:49  11/11/2016 22:40 10/19/2016 11:58
320 Levels: 10/1/2016 10:18 10/1/2016 16:48 ... 9/9/2016 13:45

심지어 아까처럼 paid_off_time를 실행해보면 그냥""로 빈칸이 아닌 NA로 모두 처리가 되어있습니다.



이상 R에서 결측값과 관련된 팁이었습니다. 감사합니다.

0개의 댓글