Content

Board ID 668
Writer heojk
Write Date 2017-05-29 16:59:29
Subject R 1일차
Content #설명을 포함시키겠습니다. #왼쪽 화면은 코드를, 오른쪽 화면은 실행 결과를 포함합니다. #왜 배웁니까? #R, 데이터를 분석하기 위해 #도구?.... SAS vs. R #R download : cran.r-project.org #Rstudio download : www.rstudio.com #default workspace dir #encoding : utf-8 #R의 데이터 구조 및 종류 #Scalar 타입 #문자 a <- "Hello" a #할당은 <-(일반적인 할당), =(파라미터와 인자를 매핑), <<-(전역변수) #숫자 b <- 100 b #스크립트 실행은 커서가 있는 행을 실행하거나, 블록을 실행할 수 있음 #Ctrl+r, Ctrl+enter #논리 c <- TRUE #TRUE, T, FALSE, F #구조형 변수 #vector, matrix, array #벡터, 1차원, 같은 데이터 타입 x <- c("Hello", "Nice", "World") x y <- c(10, 20, 30) y z <- c(TRUE, TRUE, FALSE, TRUE) z a <- c(x,y,z) a b <- c(y,z) b a <- 1:10 #sequence a b <- seq(11, 20) b ?seq b <- seq(from=11, to=20, by=1) b b <- seq(from=11, to=30, by=2) b a b (c <- a+b) (c <- 1:5 + 1:10) 1:5 1:10 rep() ?rep rep(1:5, 2) rep(1:5, times=2) rep(1:5, each=2) rep(1:5, each=3, times=2) #matrix (x <- matrix(1:15, nrow=5, ncol=3)) #열 우선 (x <- matrix(1:15, nrow=5, ncol=3, byrow=TRUE)) #행 우선 #행렬의 곱은? %*% y <- matrix(1:15, nrow=3, ncol=5) #복합형 변수 x %*% y #작업자 두명과, 세가지 작업의 작업시간에 따른 총 급여 계산 예 #배열 #3차원 이상 표현할 때 x <- array(1:24, dim=c(3,4,2)) x class(x) dim(x) dim(x) <- c(6,4) #차원을 변경 x class(x) dim(x) <- NULL #벡터는 차원이 없음 attr(x, "dim") <- NULL #attr 함수를 이용해서 속성을 변경할 수 있음 class(x) x dim(x) x <- c(1:10) x[3] #인덱스는 1부터 시작 y <- matrix(1:12, ncol=3) y[2,3] z <- array(1:24, dim=c(3,4,2)) z[1,3,2] #1행 3열 2면 데이터 조회 z #행의 수, 열의 수 조회 NROW(x) nrow(x) # 벡터에서 소문자는 사용 못함 nrow(y) # 행렬과 배열에서 사용 nrow(z) #NROW는 벡터, 행렬, 배열에서 사용 가능 NROW(y) NROW(z) length(x) #항목의 길이 length(y) length(z) #이름 조회 x <- 1:3 names(x) names(x) <- c("하나", "둘", "셋") x y <- matrix(1:12, ncol=3) names(y) colnames(y) <- c("하나", "둘", "셋") rownames(y) <- c("일행", "이행", "삼행", "사행") y #데이터 조회시 제거후 조회 x x[-3] x[c(-3, -4, -5)] x[-3,-4] #2차원 데이터 조회시 사용 가능 y y[-3,-2] #3행과 2열 제거 y[3,2, drop=FALSE] #3행과 2열 데이터를 행렬로 반환 y[3,2, drop=TRUE] #3행과 2열 데이터 조회 z z[-3,-2, 1] #3행 2열 1열 제거 #list, data.frame #리스트 x <- c("하나", "둘", "셋") y <- c(1:3) z <- c(TRUE, TRUE, FALSE) a <- list(x,y,z) #리스트, 데이터 타입이 유지됨 a names(a) names(a) <- c("문자", "숫자", "논리") a a$문자 a$문자[1] a[[1> #벡터 a[1] #리스트 a[1][2] #없음 a[[1>[2] unlist(a) #데이터프레임 x y z a <- data.frame(Col1=x, Col2=y, Col3=z) a b <- data.frame(Col1=x, Col2=y, Col3=z, stringsAsFactors=FALSE) a$Col1 b$Col1 a[2,3] a[2,] #열 정보가 없을 경우 모든 열 정보 출력 a[-2,] #제외하고 출력 a[1:2,] a[c(1,3), ] a[rep(3,2), ] a[c(3,3), ] names(a) #열의 이름 출력 colnames(a) rownames(a) colnames(a) <- c("c1", "c2", "c3") colnames(a) a t(a) a head(a) tail(a) head(iris) tail(iris) subset(a, a$c2>1) subset(a, select=c("c2", "c3")) #a 데이터프레임의 첫 번째 열과 마지막 열만 빼내세요 subset(a, select=c(1,3)) ncol(a) #열의수 nrow(a) #행의 수 subset(a, select=c(1, ncol(a))) #첫 번째 열을 제외한 모든 열 조회 subset(a, select=c(-1)) subset(a, select=c(-1,-2)) #데이터 결합 rbind(a, a) cbind(a, a) #첫 번째 열을 가장 마지막 열로 옮겨주세요. cbind(subset(a, select=c(-1)), subset(a, select=c(1))) #특별한 값 #NULL, NA, NaN, Inf #is.null(), is.na(), is.nan(), is.finite() #데이터 타입 확인 class(a) str(a) summary(a) #factor, 범주형자료(변수) #성별, 거주지역, 연령대, 요일, 월 nlevels(a$c1) levels(a$c1) str(a$c1) #데이터 타입 변경 aFactor <- as.character(a$c1) str(aFactor) as.factor(aFactor) #########################################333333 # 제어문 #조건문 #if a #a데이터의 c2열이 홀수 일 경우의 c1열과 c3열을 출력하세요. #연산자 3+4 3-4 3*5 3/5 3 %% 5 # 나머지 3 %/% 5 # 몫 if((3 %% 2) == 1) { print("t") }else { print("f") } ifelse( (3 %% 2) == 1, "t", "f") ifelse( (a$c2 %% 2) == 1, "t", "f") #여러 개 항목 처리가 가능함 a #a데이터의 c2열이 홀수 일 경우의 c1열과 c3열을 출력하세요. #반복문 for(i in a$c2) { if((i %% 2) == 1) { print(paste(as.character(a$c1[i]), as.character(a$c3[i]))) }else { next } } #1부터 100까지 짝수의 합을 출력하세요. for(i in 1:100) { sum <- 0 if(i%%2 == 0) { sum <- sum + i } } sum #break, next #함수 add <- function(a, b) { return (a+b) } add(3,4) add <- function(a, b, c) { return (a+b+c) } add(3,4) #메서드 중복을 허락하지 않음 #가변인자 이용 add <- function(...) { args <- list(...) sum <- 0 for(a in args) { sum <- sum + a } print(sum) } add(2,3) add(2,3,4) sum #이거는 아까 계산 했던 변수의 값, add 함수 안에 선언한 sum과는 다름 tracemem(a) a a$c2[2] <- 20 a untracemem(a) ######################################## x <- c("하나", "둘", "셋") y <- c(1:3) z <- c(TRUE, TRUE, FALSE) a <- data.frame(c1=x, c2=y, c3=z) #파일 입/출력 save(a, file="a.RData") rm(a) load("a.RData") a save(list=ls(), file="list.RData") rm(list=ls()) load("list.RData") ?write.csv write.csv(a, file="a.csv", row.names=FALSE) #행의 이름을 저장하지 않음 rm(a) (a <- read.csv("a.csv", header=TRUE)) str(a) (a <- read.csv("a.csv", header=TRUE, stringsAsFactors=FALSE)) str(a) #인코딩 지정 write.csv(a, file="a.csv", row.names=FALSE, fileEncoding="utf-8") #행의 이름을 저장하지 않음 rm(a) (a <- read.csv("a.csv", header=TRUE, fileEncoding="utf-8")) write.table(a, file="a.data", sep=",", row.names=FALSE, col.names=TRUE) rm(a) (a <- read.table("a.data", sep=",", header=TRUE)) ################################################# x <- c(60, 50, 80, 90) y <- c(80, 40, 60, 80) z <- c(80, 75, 95, 60) jumsu <- data.frame(kor=x, eng=y, math=z) jumsu apply(jumsu, 1, mean) apply(jumsu, 2, mean) apply(jumsu, c(1,2), mean) lapply(1:10, function(x) { return (x*x)}) #벡터 또는 리스트를 받아 리스트로 출력 sapply(1:10, function(x) { return (x*x)}) jumsu$gender <- c("남", "여", "여", "남") str(jumsu) tapply(jumsu$kor, jumsu$gender, mean) #iris 데이터에서 종별 꽃잎의 길이 평균과 너비 평균을 구하세요. summary(iris) attach(iris) tapply(Petal.Length, Species, mean) tapply(Petal.Width, Species, mean) detach(iris) #iris 데이터에서 종별 꽃잎의 길이 평균과 표준편차를 구하세요.(apply 이용) attach(iris) avg <- tapply(Petal.Length, Species, mean) library("stats") sd <- tapply(Petal.Length, Species, sd) cbind(avg, sd) detach(iris) with(iris, { avg <- tapply(Petal.Length, Species, mean) #library("stats") sd <- tapply(Petal.Length, Species, sd) cbind(avg, sd) }) aggregate(Petal.Length~Species, iris, mean) install.packages("sqldf") library(sqldf) sqldf("select distinct Species from iris") sqldf('select Species, avg("Sepal.Length") as avg_sapal_length from iris group by Species') sqldf("select * from iris limit 10") sqldf("select * from iris limit 10, 5") #plyr 패키지 install.packages("plyr") library(plyr) #xyplyr #x 는 a(배열), d(데이터프레임), l(리스트) 중 하나가 입력 타입 #y는 a(배열), d(데이터프레임), l(리스트), _(출력 없음) 중 하나가 출력 타입 #예 iris[, 1:4] adply(iris[, 1:4], 2, function(col) { sum(col)}) ddply(iris, .(Species), function(group) { data.frame(mean=mean(group$Sepal.Length))}) a<-ddply(iris, .(Species), transform, valA=Sepal.Length) a<-ddply(iris, .(Species), mutate, valA=Sepal.Length) head(a) ##############################3 #데이터 구조 변경 install.packages("reshape2") library("reshape2") head(airquality) data <- melt(airquality, id=c("Month", "Day"), na.rm=TRUE) head(data) #reshape 패키지의 함수 data2 <- cast(data, Month + Day ~ variable, fun.aggregate=NULL) #NULL head(data2) #reshape2 패키지의 함수 data2 <- dcast(data, Month + Day ~ variable, fun.aggregate=NULL) #NULL head(data2) ?airquality #iris 데이터에서 종별 꽃잎의 길이 평균과 표준편차를 구하세요.(data.table이용)