본문 바로가기
C++ 200제/코딩 IT 정보

[R 코딩 기초] 데이터 구조 변환 방법 (벡터 - 리스트 - 행렬 - 프레임)

by vicddory 2018. 4. 26.

[R 코딩 기초] 데이터 구조 변환 방법 (벡터 - 리스트 - 행렬 - 프레임)


R 코딩 기초 문제


어떤 데이터 구조의 변수를 다른 것으로 바꾸고 싶다. 예를 들어, 벡터를 리스트로 바꾸거나 행렬을 데이터 프레임으로 바꾸려고 한다.


R 코딩 기초 해결책


다음 함수들은 해당하는 데이터 구조로 인자를 변환한다.


- as.data.frame(x)

- as.list(x)

- as.matrix(x)

- as.vector(x)


하지만 이 중 몇몇 변환은 여러분을 놀라게 할 수도 있다. 아래 표를 확인해 보기 바란다.


변환

 방법

 주석

 벡터->리스트

 as.list(vec)

 list(vec)을 사용하지 말자. 유일한 원소가 vec의 복사본인, 원소 한 개짜리 목록을 만든다.

 벡터->행렬

 열 한 개짜리 행렬: cbind(vec) 또는 as.matrix(vec)

 행 한 개짜리 행렬: rbind(vec)

 n x m 행렬: matrix(vec,n,m)

 레시피 5.14 참고

 벡터->데이터 프레임

 열 한 개짜리 데이터 프래임: as.data.frame(vec)

 

 리스트->벡터

 unlist(lst)

 as.vector 대신 unlist를 쓰자. 주석 1, 레시피 5.11 참고

 리스트->행렬

 열 한 개짜리 행렬: as.matrix(lst)

 행 한 개짜리 행렬:

as.matrix(rbind(lst))

n x m 행렬: matrix(lst,n,m)

 

 리스트->데이터 프레임

 목록 원소들이 데이터의 열이면: as.data.frame(lst)

 

 행렬->벡터

 as.vector(mat)

 행렬의 모든 원소를 벡터로 반환한다.

 행렬->리스트

 as.list(mat)

 행렬의 모든 원소를 리스트로 반환한다.

 행렬->데이터 프레임

 as.data.frame(mat)

 

 데이터 프레임->벡터

 행 하나짜리 데이터 프레임 변환: dfrm[1,]

열 하나짜리 데이터 프레임 변환: dfrm[,1] or dfrm[[1]]

 주석 2 참고

 데이터 프레임->리스트

 as.list(dfrm)

 주석 3 참고

 데이터 프레임->행렬

 as.matrix(dfrm)

 주석 4 참고

논의 (벡터 리스트 행렬 프레임 전환)


데이터 구조들을 상호 변환하는 건 까다로울 수 있다. 그래도 일부는 생각대로 변환된다. 이를테면 행렬을 데이터 프레임으로 변환한다면 행렬의 행과 열은 데이터 프레임의 행과 열이 된다. 별거 없다. 하지만 그 외의 경우에는 결과를 보고 생각했던 것과 달라 놀랄 수도 있다. 표에 알아두면 좋을 만한 예를 요약해 두었다. 다음은 표의 주석이다.


R 코딩 기초 데이터 구조 변환[R 코딩 기초] 데이터 구조 변환 방법 (벡터 - 리스트 - 행렬 - 프레임)


주석 1)

리스트를 벡터로 변환할 때는, 리스트가 모두 같은 모드로 된 단일 값으로 되어 있으면 변환이 깔끔하다. 하지만 다음 둘 중 하나의 경우엔 상황이 복잡해진다.


(a) 리스트에 모드가 섞여 있다(예: 수치형과 문자형). 이 경우 모든 것이 문자열로 변환된다.

또는 (b) 리스트에 하위 리스트나 데이터 프레임 같은, 다른 데이터 구조가 포함되어 있다. 이 경우 이상한 일이 발생하니 변환하지 말자.


주석 2)

데이터 프레임을 벡터로 변환하는 것은 데이터 프레임이 행 하나 또는 열 하나만 가지고 있는 경우에만 말이 된다. 거기에 있는 모든 원소를 하나의 긴 벡터로 추출하려면 as.vector(as.matrix(dfrm))를 사용한다.


하지만 그것조차도 데이터 프레임의 원소가 모두 수치형이거나 모두 문자형일 때만 옳은 것이다. 그렇지 않다면 모든 것이 먼저 문자열로 변환된다.


주석 3)

데이터 프레임은 이미 리스트(즉, 열들의 리스트)이기 때문에 데이터 프레임을 리스트로 변환하는 것은 이상하게 보일 수 있다. as.list를 사용하면 클래스(data.fram)가 제거되고 그 기저에 있는 리스트가 나타난다. 이 R 코딩 기초 방법은 R이 여러분의 데이터 구조를 리스트로 다루게 하고 있을 때 유용하다. 이를테면 출력이라든가.


주석 4)

데이터 프레임을 행렬로 변환할 때는 조심하자. 만약 데이터 프레임이 숫자값만 가지고 있으면 수치형 행렬이 나온다. 문자값만 가지고 있으면 문자형 행렬이 나온다.


하지만 만약 데이터 프레임이 숫자, 문자 그리고(또는) 요인이 혼합된 거라면 모든 값은 먼저 문자로 변환되고 결과는 문자열로 된 행렬이 된다.


행렬의 문제

여기서 자세히 설명한 행렬 변환에서는 행렬이 동질적이라고 가정한다. 즉, 모든 원소가 같은 모드(예: 모두 수치형이거나 모두 문자형)라고 생각하는 것이다. 하지만 행렬이 리스트에서부터 만들어진 경우 이질적일 수도 있다. 만약 그런 경우라면 변환이 지저분해집니다.


예를 들어 모드가 섞인 행렬을 데이터 프레임으로 만든다면, 혼합된 데이터에 맞추기 위해서 그 데이터 프레임의 열들은 리스트가 되듯이 말이다.



출처 : R Cookbook, 폴 티터, 인사이트

[R 코딩 기초] 데이터 구조 변환 방법 (벡터 - 리스트 - 행렬 - 프레임)

댓글