MA VPD Tech Blog.

R 활용 사용법(심화)1

December 17, 2019 | 3 Minute Read

##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])



로고