티스토리 뷰

간혹 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 등에서 자료 읽는 데에 오류가 생기는 일을 막을 수 있다. 







공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함