2014 년 가을학기 손시운 지도 교수 : 문양세 교수님
리스트 벡터는 모든 원소가 같은 형식을 가져야만 함 리스트는 다른 형의 객체끼리도 결합이 가능 – Python 의 Dictionary, Perl 의 Hash, C 의 Structure 와 같은 개념 리스트는 데이터 프레임 (ch.5) 등의 기본을 형성하는 중요한 역할 2 namesalaryunion “Joe”55000TRUE employee
리스트의 생성 (1/3) list() 함수 : 리스트를 생성하는 함수 – e.g.) 이름이 “Joe”, 연봉이 이며 노조에 가입한 직원의 데이터 – 위처럼 태그 ( 구성 요소의 이름 ) 를 지정하여, 데이터를 쉽게 표현할 수 있음 3
리스트의 생성 (2/3) list() 함수 – 태그는 선택적 요소이므로 생략하여 사용할 수 있음 – 태그를 생략할 경우, 태그는 숫자 인덱스로 자동 지정 – 하지만 숫자 인덱스 대신 이름을 붙이는 편이 더 명확 4
리스트의 생성 (3/3) 리스트는 벡터이므로 vector() 함수를 통해 생성이 가능 – vector() 함수 : 벡터를 만드는 함수이며, mode 인수에 형식을 지정하여 사용 5
일반 리스트 연산 (1/7) 리스트 인덱싱 (1/2) – 리스트의 구성요소에는 여러 방법으로 접근이 가능 $ 기호를 사용하여 접근 하는 방법 다른 구성요소와 겹치지 않는 선에서 이름을 축약하여 접근하는 방법 인덱스에 구성요소의 이름을 넣어 접근하는 방법 구성요소의 숫자 인덱스를 이용하여 접근하는 방법 6
일반 리스트 연산 (2/7) 리스트 인덱싱 (2/2) – 리스트에서 구성요소의 데이터 형으로 가져올 경우, 대괄호를 두 개 ([[) 사용 대괄호를 하나만 ([) 사용할 경우 결과는 리스트 – 결과로 가져오는 데이터는 같으나 데이터 형이 다르므로 유의하여 사용해야 함 7
일반 리스트 연산 (3/7) 원소의 추가 / 삭제 (1/4) – 리스트는 벡터의 한 형태지만, 원소의 추가 / 삭제가 가능 – 리스트에서 원소의 추가 / 삭제는 매우 빈번히 사용 – 원소의 추가는 리스트가 생성된 후에만 가능 8
일반 리스트 연산 (4/7) 원소의 추가 / 삭제 (2/4) – 구성 요소를 추가할 때도 벡터 인덱스를 사용할 수 있음 9
일반 리스트 연산 (5/7) 원소의 추가 / 삭제 (3/4) – 리스트에서 해당 부분을 NULL 로 설정하여 구성요소를 제거 – z$b 가 삭제된 후, 원소의 인덱스가 1 씩 이동됨 10
일반 리스트 연산 (6/7) 원소의 추가 / 삭제 (4/4) – 리스트들을 합치는 것도 가능 11
일반 리스트 연산 (7/7) 리스트의 크기 확인 – 리스트는 벡터이므로 length() 함수를 사용해 크기를 확인할 수 있음 12
리스트의 벡터화 unlist() 함수 : 리스트를 벡터로 변환하는 함수 – 벡터 원소들의 이름은 원 리스트의 구성요소 이름에서 가져옴 – 리스트에서 가져온 벡터의 데이터 형이 문자열 벡터의 구성요소들은 모두 같은 데이터 형을 가져야 함 리스트를 벡터화할 경우, 리스트의 구성요소 중 최대로 포함할 수 있는 형태를 선택 NULL < 이진수 < 정수형 < 실수 < 복소수 < 문자 < 리스트 < 표현식 13
리스트에 함수 적용 lapply(), sapply() 함수 : 리스트에 함수를 간편하게 적용할 수 있는 함수 – lapply() 함수 : 리스트의 각 요소에 함수를 적용하고, 리스트를 반환하는 함수 – sapply() 함수 : lapply() 함수의 결과를 벡터나 행렬로 반환하는 함수 14
재귀 리스트 (1/2) 리스트 내에 리스트를 갖는 재귀적 구조의 리스트 15
재귀 리스트 (2/2) 연결함수 c() 를 통해 재귀 리스트 생성이 가능 – recursive 인수를 사용하여 “ 편평화 flattening ” 가 가능 ( 벡터화 ) 16
확장 예제 : 단어 위치를 리스트로 표현 영문으로 구성된 문서에 포함된 각 단어의 위치를 리스트로 표현 17
확장 예제 : 단어 위치를 리스트로 표현 데이터 파일로부터 단어를 읽어 들임 – ‘ 단어 ’ 는 단순히 공백으로 구분된 문자들의 조합을 의미 – scan() 함수 : 파일을 읽고, 구분자 단위로 구분하여 벡터를 생성 18 findwords <- function(tf) { txt <- scan(tf, "") }
확장 예제 : 단어 위치를 리스트로 표현 함수에서 반환할 리스트 생성 txt 에 저장된 단어를 소문자화 19 findwords <- function(tf) { txt <- scan(tf, "") wl <- list() … return(wl) } findwords <- function(tf) { txt <- scan(tf, "") wl <- list() for (i in 1:length(txt)) { wrd <- tolower(txt[i]) } return(wl) }
확장 예제 : 단어 위치를 리스트로 표현 리스트 인덱싱 사용하여 wl 에 단어와 위치를 저장 – 존재하지 않는 인덱스의 경우, R 은 NULL 로 설정하므로 c() 함수 적용이 가능 20 findwords <- function(tf) { txt <- scan(tf, "") wl <- list() for (i in 1:length(txt)) { wrd <- tolower(txt[i]) wl[[wrd]] <- c(wl[[wrd]], i) } return(wl) }
확장 예제 : 단어의 빈도수 분석 앞의 예제에서 구한 리스트 결과를 단어 빈도 순으로 정렬 21
확장 예제 : 단어의 빈도수 분석 단어 리스트에 포함된 단어의 개수를 벡터에 저장 – length 함수를 리스트에 적용하여, 각 단어의 빈도수를 확인 빈도수가 적은 순서대로 리스트를 정렬하여 반환 – order() 함수 : 벡터의 정렬된 값에 대한 인덱스를 반환 22 freqwl <- function(wrdlst) { freqs <- sapply(wrdlst, length) } freqwl <- function(wrdlst) { freqs <- sapply(wrdlst, length) return(wrdlst[order(freqs)]) }
확장 예제 : 단어의 빈도수 분석 문서에 나타난 단어의 빈도수가 높은 10 % 를 플로팅 – 2009 년 뉴욕타임스에 실린 기사에 포함된 코드 23
과제 #2 임의의 영문 문서 데이터에서 빈도수가 높은 10% 를 플로팅 – 예제 데이터가 아닌, 별도의 영문 문서 데이터를 수집 데이터는 10kB 이상, 100kB 미만 다른 학생과 데이터를 공유하지 않고 직접 수집 – 앞서 진행한 예제와 동일한 방법으로 플로팅 제출 방법 – 과제는 로 – 제목 양식 : [ 학번 ][ 이름 ]HW#2 – 과제에 사용한 데이터, 함수 실행 과정 및 결과 값을 캡쳐 – 제출 기한은 다음 주 수업시간 전까지이며, 그 후에 제출할 경우 20% 감점 24