Idealim
article thumbnail
Published 2023. 10. 17. 21:26
[R] 리스트 Data/R

리스트와 데이터 프레임

이번 게시글에서는 `리스트`와 `데이터 프레임`에 대해 알아보겠습니다. 지금까지 R의 벡터, 행렬, 배열에 대해 알아보았는데요. 이들은 동일한 타입의 원소만을 가질 수 있었습니다. 반면, 리스트와 데이터 프레임에서는 서로 다른 데이터 타입의 원소를 가질 수 있습니다.

리스트

즉, `리스트`는 서로 다른 데이터 타입의 집합이 필요할 때 사용하는 데이터 구조입니다. (파이썬의 Dictionary 와 유사하다고 생각하면 됩니다.)

List(리스트)는 R 리스트는 임의의 객체를 포함할 있는 벡터 유형입니다. 리스트는 요소로 다른 벡터, 스칼라, 다른 리스트 또는 복잡한 객체를 가질 있으며, 이러한 리스트의 요소들은 서로 다른 데이터 유형일 있습니다. , 리스트는 `재귀적`이라고도 하며, 요소들을 작은 단위로 분해할 있습니다. 예를 들어, 리스트 내에 다른 리스트를 포함할 있으며, 이러한 중첩된 리스트들이 계속해서 작은 리스트로 구성될 있습니다.

리스트 생성

`list()`를 이용해 리스트를 생성할 수 있습니다.

이처럼 리스트는 서로 다른 데이터 타입의 원소들을 가질 수 있습니다.

여기서 흥미로운 사실은 리스트도 벡터의 모드(행렬, 배열...) 중 하나로 `vector()`를 통해서도 리스트를 생성할 수 있다는 것입니다.

리스트 인덱싱

리스트의 원소에 접근하기 위해서는 `$`, `[[]]`을 이용할 수 있습니다.

여기서 주의할점은 이중 브라켓([[]])을 사용해야한다는 점입니다.

만약 `[]`을 이용한다면 어떻게 될까요?

차이점을 눈치채셨나요? `[]`을 이용한 경우에는 list로 반환된다는 점입니다. 참고로 `[[]]`는 벡터로 반환됩니다.

원소 추가/삭제하기

리스트에서는 재할당할 필요없이 원소를 추가할 수 있는데요. 위 코드 결과를 확인하면 age가 추가되고 union이 삭제된 것을 확인할 수 있습니다. 참고로 데이터를 삭제하기 위해서는 NULL를 변수에 넣어주면 됩니다.

재귀적 특징

위에서 언급했듯이 리스트는 재귀적 특징을 보이는데요. 즉, 리스트 안에 리스트를 넣을 수 있습니다. 이를 코드로 확인해보겠습니다.

만약 리스트 안에 존재하는 리스트의 age에 접근하려면 어떻게 해야될까요?

위와 같이 [[]]을 두번 사용하거나 [[]]$을 이용하면 됩니다.

리스트 크기 (length vs lengths)

`length()`는 리스트의 크기를 반환합니다. 추가로 `lengths()`는 리스트 안 원소의 크기를 반환합니다.

리스트 이름

`names()` 을 이용하면 리스트의 이름을 가져올 수 있습니다.

추가로 `unname()`을 이용하면 리스트의 이름을 삭제할 수 있습니다.

리스트를 벡터로 가져오기

`unlist()`을 이용하면 리스트를 벡터로 가져올 수 있습니다.

모든 원소들이 자동으로 문자열로 변환된 것을 확인할 수 있습니다. 

다른 방법으로는 `c()`를 이용하면 됩니다. 단, recursive=TRUE로 설정해야합니다.

lapply(), sapply()

저번 게시글에서 apply() 함수에 대해 다뤘었는데요. apply() 계열 함수는 기본적으로 데이터 구조(벡터, 행렬, 배열 등)에 함수를 적용시키기 위해 사용했었습니다. 이번에는 `lapply()`, `sapply()`에 대해 알아보겠습니다.

1) lapply()

`lapply()`는 lapply(x, f, fargs) 형태로 사용합니다.

  • `x`: 벡터, 리스트 표현식 또는 데이터 프레임
  • `f`: 적용할 함수
  • `fargs`: 적용할 함수의 인자
  • return: 리스트

`lapply()`를 이용해 리스트 원소의 평균 값을 구했습니다. 반환 값은 리스트(list)입니다.

2) sapply()

`sapply()`는 `lapply()`와 유사한데요. 다만, 차이점은 `lapply()`는 결과로 리스트를 반환하는 것에 반해 `sapply()`는 벡터, 행렬, 배열을 반환합니다.

좀 더 심플한(simple)한 형태인 벡터를 반환한 것을 확인할 수 있습니다.


반응형
profile

Idealim

@Idealim

읽어주셔서 감사합니다. 잘못된 내용이 있으면 언제든 댓글로 피드백 부탁드립니다.