내용 |
#설명을 포함시키겠습니다.
#왼쪽 화면은 코드를, 오른쪽 화면은 실행 결과를 포함합니다.
#왜 배웁니까?
#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이용)
|