2.3 리스트(list)

  • 리스트(list): (key, value) 형태로 데이터를 저장한 배열(벡터)
  • 서로 다른 데이터 타입을 가진 객체를 원소로 가질 수 있는 벡터
    • 예: 한 리스트 안에는 상이한 데이터 타입(숫자형, 문자형, 논리형 등)을 갖는 원소(객체)들을 포함할 수 있음

리스트 예시: 통계프로그래밍언어 중간고사 성적 테이블

  • 중간고사 성적 테이블은 이름, 학번, 출석률, 점수, 등급으로 이루어졌다고 가정하면 “김상자”의 성적 리스트는 다음과 같이 나타낼 수 있음
  • LIST(이름 = "김상자", 학번 = "202015115", 점수 = 95, 등급 = "A-")
  • 위 record에서 보듯이 문자형과 숫자형이 LIST 안에 같이 표현되고 있음
  • 위 record를 벡터 생성함수 c()로 생성한 경우
       이름        학번        점수        등급 
   "김상자" "202015115"        "95"        "A-" 
[1] "character"

객체 명칭 규칙을 벗어나는 이름을 객제명으로 사용하고 싶다면 다음과 같이 홀따옴표 `object_name` 표시를 통해 사용 가능함

[1] 75 82 92
[1]  3  6  9 12

2.3.1 리스트 생성

  • list() 함수를 사용해 list 객체 생성
  • 중간고사 성적 테이블 예시
$이름
[1] "김상자"

$학번
[1] "202015115"

$점수
[1] 95

$등급
[1] "A-"
$이름
[1] "character"

$학번
[1] "character"

$점수
[1] "double"

$등급
[1] "character"
  • 리스트 원소에 이름이 부여된 경우 names()를 통해 확인 가능
[1] "이름" "학번" "점수" "등급"
  • 이름(name_1, .., name_n) 없이도 리스트 생성 가능하나, 가급적 이름을 부여 하는 것이 더 명확
[[1]]
[1] "김상자"

[[2]]
[1] "202015115"

[[3]]
[1] 95

[[4]]
[1] "A-"
  • 리스트는 벡터이므로 vector() 함수를 통해 생성 가능
[[1]]
NULL
  • 리스트의 값이 어떤 객체든 관계 없음
$name
[1] "A" "B" "C"

$salary
[1] 500 450 600

$union
[1] TRUE

2.3.2 리스트 색인

  • 리스트에 포함된 객체에 접근는 기본적으로 벡터의 색인 방법과 동일하게 색인 번호 또는 키(이름)을 통해 접근 가능
  • 리스트에 포함된 모든 객체의 원소값을 쉽게 확인하는 함수는 unlist()
[1] "character"
Table 2.4: 리스트 데이터 접근 방법
색인방법 동작
x$name 리스트 x 에서 객체명(name)에 해당하는 객체에 접근
x[[i]] 또는 x[[name]] 리스트 x 에서 i 번째 또는 name에 해당하는 객체 반환
x[i] 또는 x[name] 리스트 x 에서 i 번째 또는 name에 해당하는 부분 리스트 반환
  • x$name을 통해 리스트 내 객체 접근
[1] "202015115"
  • x[[i]] 또는 x[[name]] 을 통해 리스트 내 객체 접근
[1] "202015115"
[1] "202015115"
[1] "character"
  • x[i] 또는 x[name] 을 통해 리스트 내 부분 리스트 추출
$학번
[1] "202015115"
$학번
[1] "202015115"
[1] "list"
  • 리스트 또한 벡터로 볼 수 있기 때문에 여러 개의 부분 리스트 추출 가능
$이름
[1] "김상자"

$학번
[1] "202015115"

$점수
[1] 95
  • 리스트를 구성하는 객체 내 색인
$name
[1] "A" "B" "C"

$salary
[1] 500 450 600

$union
[1] TRUE
[1] 450 600
[1] 450 600
[1] 450 600
[1] 450 600
  • 리스트의 길이 반환: 벡터와 마찬가지로 length() 함수 적용 가능
[1] 4
[1] 3

2.3.3 리스트에 원소 추가/제거

  • 주어진 리스트 x에 새로운 원소를 x$new_obj <- value 명령어 형태로 추가
  • 이미 존재하고 있는 리스트 원소 제거는 x$exist_obj <- NULL 형태로 제거
$이름
[1] "김상자"

$학번
[1] "202015115"

$점수
[1] 95

$등급
[1] "A-"
$이름
[1] "김상자"

$학번
[1] "202015115"

$점수
[1] 95

$등급
[1] "A-"

[[5]]
[1] 10  8  9  9  8
$이름
[1] "김상자"

$학번
[1] "202015115"

$점수
[1] 95

$등급
[1] "A-"
$이름
[1] "김상자"

$학번
[1] "202015115"

$점수
[1] 95

$등급
[1] "A-"

[[5]]
[1] 10

[[6]]
[1] 8

[[7]]
[1] 9

[[8]]
[1] 9

[[9]]
[1] 8
$이름
[1] "김상자"

$학번
[1] "202015115"

$점수
[1] 95

$등급
[1] "A-"

2.3.4 리스트의 결합

  • 두 개 이상의 리스트를 결합 시 c() 사용
$이름
[1] "김상자"

$학번
[1] "202015115"

$점수
[1] 95

$등급
[1] "A-"

$name
[1] "A" "B" "C"

$salary
[1] 500 450 600

$union
[1] TRUE
리스트 내에 리스트를 가질 수 있다. 이를 재귀 리스트(recursive list)라고 한다. 예를 들어 위 예제에서 각 학생의 성적 데이터가 리스트로 구성되어 있다면, 전체 성적 데이터베이스는 리스트로 구성된 리스트임. 아래 예제 처럼 간단한 재귀 리스트 구현이 가능
$kim
$kim$id
[1] "20153345"

$kim$sex
[1] "Male"

$kim$score
[1] 85

$kim$grade
[1] "B+"


$lee
$lee$id
[1] "20153348"

$lee$sex
[1] "Female"

$lee$score
[1] 75

$lee$grade
[1] "B0"