Wednesday, June 16, 2010

[R::manual] 무규칙 데이터 읽기

R은 항상 format 된 table 데이터를 읽어 graphing 하는데만 사용해왔는데,
이번에 특정 format이 존재하지 않는 데이터를 처음으로 처리해봤다.
이 과정을 정리해 본다.

DATA format

1 2 3 4 5
1 2 3
1 2 3 4 5 6 7 8 9 10

과 같이 각 row의 column 개수가 일정하지 않는 input data

1. Reading file

먼저 readLines 함수를 사용해 파일을 읽는다.


>raw_data=readLines('file')


이렇게 읽은 결과는

[1] "1 2 3 4 5"
[2] "1 2 3"
[3] "1 2 3 . . . 10"

과 같이 각 row가 list에 string 으로 저장된다.

2. String split

각 row의 string을 각각의 numeric value 로 구분한다.


> data=strsplit(da,' ')


결과는
"1 2 3 4 5" 가
"1", "2", "3","4","5" 으로 각 numeric value별로 떨어져 저장

3. Converting character to numeric value

"1","2" 와 같이 각 numeric value 가 떨어진 것 처럼 보이나,
이들은 numeric variable이 아니라, 아직까지 character variable 이다.

실제 이 숫자들을 가지고, plotting, statistic test를 수행하기 위해서는
이들을 numeric variable로 인식되도록 해야 한다.

이때, as.numeric 함수를 쓸 수 있는데, 문제는 이 함수의 입력값이
독립 variable이어야 한다는 것이다. 즉, list 형태의 데이터는 독립
variable로 변환해야 이 함수를 사용할 수 있다.
이를 위해 unlist 함수를 사용한다.

이들 함수를 한번에 쓰면,


> final=as.numeric( unlist( da ) )


이 때, da 가 multi level list 인 경우( list 여러개로 이뤄진 경우 )
위의 방법을 쓰면 서로 다른 level의 list를 구분없이 하나의 list로
합쳐 final로 합쳐 진다.

예를 들면,

[[1]]
[1] 1 2 3 4 5
[[2]]
[2] 6 7 8 9

로 구성된 da 라면, unlist(da) 의 결과는

[1] 1 2 3 4 5 6 7 8 9

가 된다. 원하는 결과는 원 list format 를 유지하는 경우가 대부분 일 것이다.
이런 경우에는 각 list level에 대해 각각 위 명령을 수행하여야 하는데,
일일이


a=as.numeric(unlist(da[1]))
b=as.numeric(unlist(da[2]))


와 같이 각각의 list 를 처리해 줄 순 없는 일이다.
이를 한번에 처리 한다면 아래와 같이 정리할 수 있다.


for(i in 1:length(da) ) {
da[[i]]=as.numeric( unlist(da[[i]] ) )

}