R 활용 사용법(심화)1
##R 활용 - 사용법(심화)(1/3)
작성 2019년 12월 17일 박영훈
1. 파일입출력
CSV 파일 입출력
csv 예제파일 - iris.csv csv 예제파일 - fair.csv
> (x <- read.csv("iris.csv"))
X150 X4 setosa versicolor virginica
1 5.1 3.5 1.4 0.2 0
2 4.9 3.0 1.4 0.2 0
3 4.7 3.2 1.3 0.2 0
4 4.6 3.1 1.5 0.2 0
5 5.0 3.6 1.4 0.2 0
6 5.4 3.9 1.7 0.4 0
...
write.csv(x , "iris_mod.csv", row.names = FALSE)
결과파일을 확인 할 수 있다.
객체의 파일 입출력
내부 객체를 파일로 저장하기
메모리에 있는 모든 객체를 삭제한 후 확인한다.
> x <-1:5
> y <-6:10
> save(x, y, file="xy.RData")
> rm(list=ls())
> x
에러: 객체 'x'를 찾을 수 없습니다
> ls()
character(0)
> load("xy.RData")
> ls()
[1] "x" "y"
2.데이터 조작
데이타프레임의 행과 컬럼 합치기
행 또는 컬럼 형태로 주어진 벡터, 행렬, 데이터 프레임을 합쳐서 결과로 행렬 또는 데이터 프레임을 만들어보자
x <- read.csv("iris.csv")
y <- read.csv("iris.csv")
(total <-rbind(x, y))
iris의 데이타가 150에서 300으로 증가한것을 확인할 수 있다.
cbind(x, y)
iris의 데이타의 열이 10개, 행이 150인 것을 확인 할 수 있다.
Apply계열 함수
벡터, 행렬, 데이터 프레임에 임의의 함수를 적용한 결과를 얻기 위한 Apply 계열 함수가 있다. apply() : 배열 또는 행렬에 주어진 함수를 적용한 뒤 그 결과를 벡터, 배열 또는 리스트로 반환 lapply() : 벡터, 리스트 또는 표현식에 함수를 적용하여 그 결과를 리스트로 반환 sapply() : lapply와 유사하지만 결과를 벡터, 행렬 또는 배열로 반환 tapply() : 벡터에 있는 데이터를 특정 기준에 따라 그룹으로 묶은 뒤 각 그룹마다 주어진 함수를 적용하고 그 결과를 반환 mapply() : sapply의 확장 버전으로 여러개의 벡터 또는 리스트를 인자로 받아 함수에 각 데이터의 첫째 요소들을 적용한 결과, 둘째 요소들을 적용한 결과, 셋째 요소들을 적용한 결과 등을 반환
행렬의 각 행의 합을 구하는 예제 > (d <- matrix(1:9, ncol = 3)) [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > apply(d, 1, sum) [1] 12 15 18 > apply(d, 2, sum) [1] 6 15 24
CSV에서 읽어서 각 행의 합을 구하는 예제
x <- read.csv("iris.csv")
apply(x[, 1:5], 2, sum)
X150 X4 setosa versicolor virginica
876.5 458.1 563.8 179.8 150.0
유사한 함수들
rowSums(), rowMeans(), colSums(), colMeans() > colSums(x[,1:5]) X150 X4 setosa versicolor virginica 876.5 458.1 563.8 179.8 150.0 > colMeans(x[,1:5]) X150 X4 setosa versicolor virginica 5.843333 3.054000 3.758667 1.198667 1.000000
벡터에서 각 숫자를 2배한 값 구하는 예제
> (result <- lapply(1:3, function(x){ x*2}))
[[1]]
[1] 2
[[2]]
[1] 4
[[3]]
[1] 6
리스트를 백터로 다시 변환하는 예제
> unlist(result)
[1] 2 4 6
각 컬럼의 대한 평균을 구한뒤 이 결과를 다시 데이터 프레임으로 변환한 예제 > d <- as.data.frame(matrix(unlist(lapply(x[,1:5], mean)), ncol=5, byrow=TRUE)) > names(d) <- names(iris[,1:5]) > d Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.843333 3.054 3.758667 1.198667 1
unlist는 벡터를 반환하는데 벡터는 한가지의 데이터만 저장할 수 있기 때문에 데이터가 모두 형 변환된다. 이럴 경우에는 do.call()을 사용해야 한다.
d <- as.data.frame(matrix(do.call(rbind,lapply(x[,1:5], mean)), ncol=5, byrow=TRUE))
names(d) <- names(iris[,1:5])
d
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.843333 3.054 3.758667 1.198667 1
컬럼별로 평균을 구하는데 sapply를 사용하면 행과 열을 바꿔주지 않으면 다른 데이터 프레임을 얻을 수 있다. 이에 대한 예제
> t <- read.csv("iris.csv")
> x<- sapply(t[, 1:5], mean)
> as.data.frame(x)
x
X150 5.843333
X4 3.054000
setosa 3.758667
versicolor 1.198667
virginica 1.000000
> as.data.frame(t(x))
X150 X4 setosa versicolor virginica
1 5.843333 3.054 3.758667 1.198667 1
1부터 10까지의 숫자를 홀수별, 짝수별로 묶어서 합을 구해보자
> tapply(1:10 , 1:10 %% 2 == 1 , sum)
FALSE TRUE
30 25 tapply(x, INDEX, FUN, ...) x: 벡터 INDEX : 데이타를 그룹으로 묶을 색인, 팩터를 지정해야 한다. FUN : 그룹마다 적용할 함수 ... : 함수에 전달될 인자 결과값 : 배열
정규 분포를 따르는 난수를 생성하는 rnorm()함수에 mapply()를 적용하는 예제
rnorm(10, 0, 1) //평균 0 , 표준편차 1인 난수 10개 생성
mapply(rnorm, t[, 1:5])