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