R 프로그래밍
[R] R 프로그래밍 기초(2)
DayOff
2022. 5. 3. 16:28
R 입력과 출력
- 테이블로 된 데이터 파일 읽기 (변수 구분자 포함): read.table("파일이름", sep="구분자")
- CSV 데이터 파일 읽기(변수 구분자는 쉼표): read.csv("파일이름", header=T)
- CSV 데이터 파일로 출력(변수 구분자는 쉼표): write.csv(행렬 또는 데이터프레임, "파일이름", row.names=F)
데이터 프레임과 데이터 구조
(1) 벡터(Vector)
- 벡터들은 동질적이다: 한 벡터의 원소는 모두 같은 자료형을 가진다.
- 벡터는 위치로 인덱스된다: V[2]는 V벡터의 2번째 원소이다.
- 벡터는 인덱스를 통해 여러 개의 원소로 구성된 하위 벡터를 반환할 수 있다.: V[c(2, 3)]은 V 벡터의 2번째, 3번째 원소로 구성된 하위벡터
- 벡터 원소들은 이름을 가질 수 있다.
기능 | R 코드 |
벡터에 데이터 추가 | v <- c(v, newItems) v[length(v)+1] <- newItems |
벡터에 데이터 삽입 | append(vec, newvalues, after=n) |
요인 생성 | f <- factor(v) f <- factor(v, levels) |
여러 벡터를 합쳐 하나의 벡터와 요인으로 만들기 | comb <- stack(list(v1=v1, v2=v2)) |
벡터 내 값 조회 | V[c(1, 3, 5, 7)] V[-c(2, 4)] |
(2)리스트(List)
- 리스트는 이질적이다: 여러 자료형의 원소들이 포함될 수 있다.
- 리스트는 위치로 인덱스된다: L[[2]]는 L 리스트의 2번째 원소이다.
- 리스트에서 하위 리스트를 추출할 수 있다.: L[c(2, 3)]은 L 리스트의 2번째, 3번째 원소로 이루어진 하위 리스트
- 리스트의 원소들은 이름을 가질 수 있다.: L[["Moe"]]와 L$Moe는 둘 다 "Moe"라는 이름의 원소를 지칭한다.
기능 | R 코드 |
리스트 생성 | L <- list(x, y, z) L <- list(valuename1=vec, valuename2= data) |
리스트 원소선택 | L[[n]]: n번째 원소 L[c(n1, n2, … nk)]: 목록 |
이름으로 리스트 원소선택 | L[["name"]] L$name |
리스트에서 원소 제거 | L[["name"]] <- NULL |
NULL 원소를 리스트에서 제거 | L[sapply(L, is.null)] <- NULL L[is.na(L)] <- NULL |
(3)행렬(Matrix)
R에서는 차원을 가진 벡터로 인식
기능 | R 코드 |
행렬 생성 | matrix(데이터, 행개수, 열개수) e <- matrix(1:20, 4, 5) |
차원 | dim(행렬) |
대각행렬 | diag(행렬) |
전치행렬 | t(행렬) |
역행렬 | solve(matrix) |
행렬곱 | 행렬 %*% 행렬 |
행 이름 부여 | rownames(행렬) <- c("행이름") |
열 이름 부여 | colnames(행렬) <- c("열이름") |
행렬 연산 | 행렬 + 행렬, 행렬 - 행렬 행렬 + 상수, 행렬 - 상수, 행렬*상수 |
행렬에서 행, 열 선택하기 | vec <- matrix[1, ] vec <- matrix[, 3] |
(4) 단일값(scalars)
- R에서는 원소가 하나인 벡터로 인식/처리
(5) 배열(Arrays)
- 행렬이 3차원 또는 n차원까지 확장된 형태
- 주어진 벡터에 더 많은 차원을 부여하여 생성
(6) 요인(Factors)
- 벡터처럼 생겼지만, R에서는 벡터에 있는 고유값(unique value)의 정보를 얻어 내는데, 이 고유값들을 요인의 수준(level)이라고 한다.
(7) 데이터프레임(Data frame)
- 데이터 프레임 리스트의 원소는 벡터 또는 요인이다. 벡터와 요인은 데이터 프레임의 열이다.
- 벡터와 요인들은 동일한 길이이다.
- 동일한 벡터와 요인들은 데이터프레임을 사각형으로 만든다.
- 열에는 이름이 있어야 한다.
- 각각의 열에 대해 문자형인지 수치형인지 자동적으로 구분되어 편리
- 데이터프레임은 메모리 상에서 구동된다.
기능 | R 코드 |
데이터프레임 생성 | data.frame(벡터, 벡터, 벡터) |
행결합 | rbind(dfrm1, dfrm2) newdata <- rbind(data, row) |
열결합 | cbind(dfrm1, dfrm2) newdata <- cbind(data, col) |
데이터프레임 조회 | dfrm[dfrm$gender="m"] dfrm[dfrm$변수1>4 & dfrm$변수 2>5, c(변수3, 변수4)] dfrm[grep("문자", dfrm$변수1, ignore.case=T), c("변수2, 변수3")] subset(dfrm, select=변수, subset=조건) |
데이터 선택 | lst1[[2]], lst1[2], lst1[2,], lst1[, 2] lst1[["name"]], lst1$name lst1[c("n1", "n2", .., "nk")] |
데이터 병합 | merge(df1, df2, by="공통열") |
열이름 조회 | colnames(데이터프레임) |
행, 열 선택 | subset(dfm, select=열이름) subset(dfm, select=c(열이름1, 열이름2, 열이름n)) subset(dfm, select=열이름, subset(조건)) |
이름으로 열 제거 | subset(dfm, select=-"열이름") |
열이름 변경 | colnames(dfm) <- newcolname |
NA 행 삭제 | df <- na.omit(dfm) |
데이터프레임 합치기 | cbind_dfm <- cbind(dfm1, dfm2) rbind_dfm <- rbind(dfm1, dfm2) |
(8) 데이터 구조 및 자료형 변환
기능 | R 코드 |
자료형 변환 | as.character( ) as.integer( ) |
구조 변환 | as.data.frame( ) as.list( ) as.matrix( ) |
(9) 데이터 구조 변경
기능 | R 코드 |
벡터 → 리스트 | as.list(vector) |
벡터 → 행렬 | 1열짜리 행렬: cbind(vector) 또는 as.matrix(vector) 1행짜리 행렬: rbind(vector) n * m 행렬: matrix(vector, n, m) |
벡터 → 데이터프레임 | 1열짜리 데이터프레임: as.data.frame(vector) 1행짜리 데이터프레임: as.data.frame(rbind(vector)) |
리스트 → 벡터 | unlist(list) |
리스트 → 행렬 | 1열짜리 행렬: as.matrix(list) 1행짜리 행렬: as.matrix(rbind(list)) n * m 행렬: matrix(list, n, m) |
리스트 → 데이터프레임 | 리스트 원소들이 데이터의 열이면: as.data.frame(list) 리스트 원소들이 데이터의 행이면: rbind(list[[1]], list[[2]]) |
행렬 → 벡터 | as.vector(matrix) |
행렬 → 리스트 | as.list(matrix) |
행렬 → 데이터프레임 | as.data.frame(matrix) |
데이터프레임 → 벡터 | 1열짜리 데이터프레임: dfm[[1]] 또는 dfm[, 1] 1행짜리 데이터프레임: dfm[1, ] |
데이터프레임 → 리스트 | as.list(dfm) |
데이터프레임 → 행렬 | as.matrix(dfm) |
(10) 벡터의 기본 연산
기능 | R 코드 |
벡터 연산 | 벡터1 + 벡터2 벡터1 - 벡터2 벡터1 * 벡터2 벡터1 ^ 벡터2 |
함수 적용 | sapply(벡터, 연산함수) |
파일저장 | write.csv(변수이름, "파일이름") save(변수이름, file=".RData") |
파일읽기 | read.csv("파일이름") load("파일.R") source("파일.R") |
데이터 삭제 | rm(변수) rm(list=ls()) |
데이터 변형
(1) 데이터 변형
기능 | R 코드 |
요인으로 집단정의 | v <- c(24, 23, 52) w <- c(87, 86, 92) f <- factor(c("A", "B", "C") |
벡터를 여러 집단으로 분할 | groups <- split(v, f) groups <- split(w, f) groups <- unstack(data.frame(v, f)) |
데이터프레임을 여러 집단으로 분할 | sp <- split(Car93$MPG.city, Cars93$Origin) |
리스트의 각 원소에 함수 적용 | lapply(결과를 리스트로 반환) list <- lapply(list, func) sapply(결과를 벡터 또는 행렬로 반환) vec <- sapply(list, func) |
행렬에 함수 적용 | m <- apply(mat, 1, func) m <- apply(mat, 2, func) |
데이터프레임에 함수 적용 | dfm <- lapply(dfm, func) dfm <- sapply(dfm, func) dfm <- apply(dfm, func): 데이터프레임이 동질적인 경우만(모두 문자 or 숫자) 활용 가능. 데이터프레임을 행렬로 변환 후 함수 적용 |
대용량 데이터에 함수 적용 | cors <- sapply(dfm, cor, y=targetVariable) mask <- (rank(-abs(cors)) <= 10) best.pred <- dfm[, mask] lm(targetVariable ~ bes.pred) |
집단별 함수 적용 | tapply(vec, factor, func) |
병렬 벡터, 리스트 함수 적용 | mapply(factor, v1, …, vk) mapply(factor, list1, …, list k) |
(2) 문자열, 날짜 다루기
기능 | R 코드 |
문자열 길이 | nchar("단어") |
문자열 연결 | paste("word1", "word2", sep="-") |
부분 문자열 추출 | substr("statistics", 1, 4) |
구분자로 문자열 추출 | strsplit(문자열, 구분자) |
하위 문자열 대체 | sub(old, new, string) gsub(old, new, string) |
쌍별 조합 | mat <- outer(문자열1, 문자열2, paste, sep="") |
현재 날짜 반환 | Sys.Date( ) |
날짜 객체로 변환 | as.Date( ) format(Sys.Date(), format=%m%d%y) |
날짜 조회 | format(Sys.Date(), "%a") 요일 format(Sys.Date(), "%b") 월 format(Sys.Date(), "%B") 월 format(Sys.Date(), "%d") 일 format(Sys.Date(), "%m") 월 format(Sys.Date(),"%y") 연도 format(Sys.Date(), "%Y") 연도 |
날짜 일부 추출 | d <- as.Date("2014-12-25") p <- as.POSIXlt(d) p$yday start <- as.Date("2014-12-01") end <- as.Date("2014-12-25") seq(from=start, to=end, by=1) |