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번째 원소로 구성된 하위벡터
  • 벡터 원소들은 이름을 가질 수 있다.
기능 코드
벡터에 데이터 추가 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"라는 이름의 원소를 지칭한다.
기능 코드
리스트 생성 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

 

dim 활용 예시

 

(3)행렬(Matrix)

  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)

  • 데이터 프레임 리스트의 원소는 벡터 또는 요인이다. 벡터와 요인은 데이터 프레임의 열이다.
  • 벡터와 요인들은 동일한 길이이다.
  • 동일한 벡터와 요인들은 데이터프레임을 사각형으로 만든다.
  • 열에는 이름이 있어야 한다.
  • 각각의 열에 대해 문자형인지 수치형인지 자동적으로 구분되어 편리
  • 데이터프레임은 메모리 상에서 구동된다.
기능 코드
데이터프레임 생성 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) 데이터 구조 및 자료형 변환

기능 코드
자료형 변환 as.character( )
as.integer( )
구조 변환 as.data.frame( )
as.list( )
as.matrix( )

 

(9) 데이터 구조 변경

기능 코드
벡터 → 리스트 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) 벡터의 기본 연산

기능 코드
벡터 연산 벡터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) 문자열, 날짜 다루기

기능 코드
문자열 길이 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)