본문 바로가기

Data analysis story

[R 프로그래밍]- List(리스트), Array(어레이)

안녕하세요 여러분! 벌써 데이터 타입 4번째 시간이네요!

벡터, 팩터, 매트릭스(행렬) 순으로 R의 데이터 타입에 대해 차근차근 배워 나가고 있습니다!

오늘은 데이터 타입 4번째 시간으로 리스트와 어레이에 대해서 공부해보도록 하겠습니다!

 

리스트(List)

우리가 이제껏 배워온 데이터 타입은 벡터, 팩터, 매트릭스로서

숫자면 숫자, 문자면 문자 이렇게 같은 종류의 데이터만을 가지는 구조였었는데요!

벡터와 매트릭스의 차이는 1차원이냐 2차원이냐였죠!

 

리스트는 다릅니다!

 

리스트는 서로 다른 유형을 가진 데이터들로 구성될 수 있으며

서로 다른 길이, 서로 다른 차원으로 구성될 수도 있습니다!

 

아직은 이게 무슨 말인지 감이 잘 오지 않을 수도 있는데요!

예시를 보다 보면 앞서 배운 구조들과 확실히 비교가 될 겁니다!

 

그러면 리스트를 생성해볼까요?

 

다른 데이터 타입과 마찬가지로 리스트를 생성하는 함수도 list() 입니다!

 

예를 들어 Joe라는 사람에 대한 정보를 이름, , 자녀의 수, 각 자녀의 나이를 입력한다고 해봅시다!

이름은 문자이죠? 자녀의 수는요? 숫자입니다.

자녀가 3명이라면 각 자녀의 나이를 입력할 때는 하나의 값이 아닌 여러 개의 값을 입력할 수도 있겠네요?

 

그렇다면 우리가 지금까지 배운 데이터 타입으로는 이 모든 정보를 한 변수에 저장할 수가 없습니다!

왜냐구요? 우리는 이때까지 숫자면 숫자, 문자면 문자만 넣을 수 있는 타입밖에 배우지 않았잖아요!

이럴 때 필요한 데이터 타입이 바로 리스트입니다.

 

list()함수를 이용해서 방금 말한 Joe의 정보를 Lst라는 변수에 할당해보도록 하겠습니다!

이렇게요!!

실행시켜보면 name=height=, no.children=, child.ages= 이렇게 표현이 되는데

이것들을 무엇일까요?

이들은 리스트를 이루는 각 객체로서 성분(component)라고 한답니다.

name=” Joe”. height=162, no.children=3, child.ages=c(6,4,2)는 각각 Lst의 성분들이 되는 것이죠!

따라서 list를 생성할 때는

list (key1=value1, key2=value2,… )

이렇게 코드를 입력해야 한답니다!

위의 예에서도 보이듯 각 성분들은 자료형이 달라도 되고, 길이가 달라도 됩니다!

 

리스트 원소 추출

리스트의 원소 추출을 할 때는 이 "성분"을 이용하기도 합니다. 어떻게요?

Lst에서 자녀들의 수만 가지고 오고 싶다고 해봅시다. 그럴 때는

이렇게 $기호를 써준 후 no.children을 입력하면

성분의 이름과 그 성분에 해당하는 데이터를 추출해옵니다.

실제로 Lst를 입력하고 $기호를 누르면

이렇게 Lst를 구성하는 성분들이 자동으로 나타나게 됩니다.

 

그렇다면 리스트는 [ ] 연산자로 데이터에 접근할 수 없는 건가요? 아닙니다!

[ ] 연산자를 사용해보도록 하겠습니다.

no.children은 세번째 성분이니까 [3]을 입력해볼게요. 어떤 결과가 나올까요?

아까 $기호를 사용했을 때와 같은 결과가 출력됩니다.

 

[ ] 연산자를 사용하면 그 숫자에 해당하는 번째의 성분과 그 성분에 입력된 데이터 값을 같이 읽어옵니다.

 

리스트의 원소 추출에는 또 다른 연산자가 있습니다. 바로 [[]] 연산자인데요

[ ]와는 다르니까 존재하겠죠? 어떤 차이가 있는지 [ ]연산자와 [[]]연산자를 함께 사용해서 비교해보겠습니다.

차이가 보이시나요? [[]] 연산자는 그 성분에 들어가 있는 데이터의 값만 출력합니다.

그런데 이 둘의 차이는 왜 중요한 것일까요? class함수를 사용해보면 알 수 있습니다.

[ ] 연산자는 서브리스트를 가지고 오는 것이므로 class가 리스트입니다.

하지만 [[]] 연산자는 그에 해당하는 값만 가져오기 때문에 class함수를 적용하면 numeric이라고 나오죠?

 

정리해보자면

• x$key: 리스트 x에서 키값 key에 해당하는 값

• x[n]: 리스트 x에서 n번째 데이터의 서브리스트

• x[[n]]: 리스트 x에서 n번째 저장된 값

이렇게 정리할 수가 있습니다.

 

그러면 이제 리스트 안에 리스트가 들어가 있는 조금 더 복잡한 예를 보겠습니다.

이런 예인데요

similar_song도 리스트이고

song안의 similar라는 성분의 값으로 리스트인 similar_song을 넣었으니

리스트 안의 리스트라고 할 수 있습니다.

그래서 str함수를 사용해서 song의 구조를 보면

이렇게 나오게 됩니다.

이 때 song에서 titletrack에 접근하고 싶다면

이렇게 하면 되지만

song안의 데이터와 title 안의 데이터를 한 번에 접근하고 싶다고 해서

이렇게 하면 에러가 발생하니 주의하세요!

 

그렇다면 song에서 “R you on time?”에 접근하고 싶다면 어떻게 해야할까요?

similar이라는 성분도 리스트로 이루어져 있으니 이렇게 뒤에다 [[]] 연산자를 덧붙여 주는 것입니다.

혹은

이렇게 써도 같은 결과가 나옵니다.

혹은 추출할 때 성분의 이름으로 추출해도 됩니다. 이렇게요!

 

Array

Array는 동일한 원소로만 구성된(벡터와 매트릭스와 같음), 여러 개의 차원으로 구성된 데이터입니다.

벡터(Vector)1차원 데이터, 행렬(matrix) 2차원 데이터라면 배열(array)는 다차원 데이터로서, 예를 들어 2x3차원 데이터를 행렬로 표현한다면 2x3x4 차원의 데이터는 배열로 표현된다.

2차원 이상이 이해가 안된다면

엑셀을 생각해보면 좋을 것 같아요!

예를 들어

이렇게 sheet1에는 2차원의 매트릭스 데이터가 있습니다. 그런데 sheet2에도 매트릭스 데이터가 있다고 가정해볼게요.

이렇게요!

 

그러면 sheet라는 차원이 하나 더 생겨서

2차원인 매트릭스에 sheet라는 차원을 더해 3차원을 이해할 수 있겠죠??

Array는 어떻게 생성할까요?

 

이번에도 array() 함수입니다.

array(data, dim=( , , ) dimnames=list( c( , ,), c( , ,) c( , ,))

 

data: 데이터를 저장한 벡터

dim: 배열의 차원, 이 값을 지정하지 않으면 1차원 배열이 생성됨

dimnames: 차원의 이름

 

예시를 들어볼게요!

dimnames에 대해서는 저번 포스팅에서도 잠깐 말씀드렸는데

지금 위의 예처럼 차원의 길이가 다 다를 수 있기 때문에 list함수를 사용하는 것입니다!

 

이렇게 array함수를 쓰면

삼차원의 데이터를 생성할 수 있습니다.

 

array 추출

array도 마찬가지로 데이터의 추출은 [ ] 연산자로 추출합니다. 앞의 예를 이용해서 보여드릴게요!

 

오늘은 이렇게 해서 리스트와 어레이에 대해 공부해봤습니다.

다음 포스팅은 드디어 데이터 타입의 마지막 시간입니다.

다음에 데이터프레임으로 돌아올게요!!