티스토리 뷰
간혹 R에서 작업하다가 저장한 자료를 SAS에서도 불러들여 작업을 하려고 할 때 문제가 발생하곤 한다.
보통 교재나 인터넷 글들을 보면 R에서는 결측값(missing value)을 NA로 인식하기 때문에 NA로 자주 편집하는 걸 보게 된다.
그런데 기본적으로 연속형 변수(numeric variable)에 대해 NA 처리를 하면 R은 이 값을 missing으로 인식하지만,
SAS 같은 다른 프로그램에선 변수 유형을 파악 할 때 충돌이 발생한다.
SAS는 한 변수가 연속형 변수인 경우 그 변수에 대해서는 NA 라는 문자(character)를 입력할 수 없게 된다.
만약 이렇게 만들어져 있는 변수를 제대로 읽기 위해서는 option을 지정해서 NA 가 misisng임을 SAS가 인식할 수 있게 해줘야 하지만, 명령문으로 해결하려 해도 잘 안 되곤 한다.
R에서 작업한 자료를 .csv 로 추출할 때 간단한 option만 주면 SAS에서 통상 쓰는 명령문을 적용해서 오류 없이 자료를 불러들일 수 있는 .csv 파일을 만들 수 있다.
<자료 예시>
예시에 보이는 .csv 파일은 a, b, c 변수를 가지고 있다. a는 결측값을 -999로 입력하고, b는 NA, c는 공백으로 입력했다.
보통 하나의 자료 안에서 공백은 동일한 코딩을 가지고 처리하는 게 일반적이지만.
여러 자료를 merge 하다보면 결측값 처리 방식이 다른 자료를 붙여서 이렇게 저장하는 경우가 있기도 하다.
만약 R에서 결측값을 지정하지 않고 자료를 읽으면 아래와 같이 읽힌다.
> data<-read.csv("C:/Users/Documents/example.csv", head=T)
> data
a b c
1 1 1 1
2 2 2 2
3 3 3 3
4 -999 NA NA
5 4 4 4
6 -999 NA NA
7 1 1 1
8 2 2 2
c의 공백만이 R에서 자동으로 결측값으로 인식되어 NA로 읽힌다.
a의 -999는 결측값이 아니라 단순히 -999를 나타내는 값으로 인식되고 있고, b의 NA는 문자 변수로 읽힌다.
1) 결측값을 지정해서 csv 파일을 읽기
(Reading .CSV file while defining missing values)
> data<-read.csv("C:/Users/Documents/example.csv", head=T, na.strings=c("-999", "NA", ""))
> data
a b c
1 1 1 1
2 2 2 2
3 3 3 3
4 NA NA NA
5 4 4 4
6 NA NA NA
7 1 1 1
8 2 2 2
.csv 파일을 읽을 때 option으로 na.strings=c()를 써서 결측값을 인식해 data로 저장한다.
이렇게 한 후 저장된 data 오브젝트를 보면 각각 -999, NA, 공백으로 입력되어 있던 결측값들이 모두 R안에서 결측값을 의미하는 NA 로 읽힌다.
이제 다시 이 data 파일을 NA 가 아니라 공백을 가진 .csv 파일로 추출하려면 결측값 NA를 공백값으로 대체한 후 .CSV 파일을 저장할 수 있다.
2) 결측값을 다른 값으로 대체하는 방법
(Replacing missing values with another value)
>data[is.na(data)]<-""
>data
a b c
1 1 1 1
2 2 2 2
3 3 3 3
4
5 4 4 4
6
7 1 1 1
8 2 2 2
> write.csv(data, "C:/Users/Documents/a.csv", row.names=F)
is.na()는 자료에 결측값이 있는지 확인하는 명령어이다.
data[is.na(data)]<-"" 는 data 오브젝트 안에 있는 결측값(NA로 먼저 인식)들을 공백값으로 재 표시 한다.
이제 이 data 오브젝트를 .csv 로 추출하면 SAS에서 불러들일 때 연속형(numeric) 변수에 저장된 NA 때문에 오류가 생기는 일을 막을 수 있다.
* row.names=F는 행 번호를 제외하고 파일을 추출한다. row.names=F 없이 write.csv를 쓰면 행 번호, a, b, c 총 4개의 열을 갖는 .csv 파일이 생성된다.
3) 결측을 공백으로 자동 지정해 .CSV를 저장하는 방법
(Writing CSV file with na=)
사실 2)번 예시처럼 결측값 NA를 공백 ""로 굳이 바꾸지 않아도 write.csv 명령에서 option을 통해 NA 를 공백으로 자동 저장할 수 있다.
> write.csv(data, "C:/Users/Documents/a.csv", row.names=F, na="")
na="" option은 오브젝트의 결측값을 공백으로 처리해 .CSV 파일로 저장한다.
저장 완료된 파일을 열어보면 다음과 같다.
만약 na="" 없이 .CSV 를 저장하면
이런 .CSV 가 만들어지기 때문에 CSV 에서 이 .CSV 파일을 읽을 때 a, b, c 변수 유형에 맞지 않는 값들이 입력되어 있다며 자료 불러오는 과정에서 오류가 생긴다.
결과적으로 R에서 통상 NA 로 결측값들을 처리하고 작업을 하다가 .CSV 로 저장할 때, 다른 프로그램에서도 그 .CSV를 사용할 걸 감안해서 na="" option을 잊지 않고 쓰면 SAS 등에서 자료 읽는 데에 오류가 생기는 일을 막을 수 있다.