top of page
  • 작성자 사진JC.kim

[R Programming] 함수 및 데이터 생성과 불러오기


이번엔 함수와 데이터를 생성하는것과 불러오는 것에 대해 알아보자. 먼저 함수를 생성해보자.


square <- function(x){

return(x*x)

}

우리가 R에서 함수를 생성할 때는, function 이라는 구문을 사용한다. 여기에 {}기호를 사용하여 생성될 함수 x에 대한 return값을 함수의 내부에 만들어 주었다. return에서 x는 x*x이므로, 이 함수는 x^2을 나타내는 함수가 될 것이다. square라는 이름으로 제곱을 계산하는 함수를 만든셈이다. 여기에 원하는 값을 넣어 계산을 할 수 있다. square(9) 라는 값을 넣으면 81이라는 값이 출력될 것이다. C언어에서 Local function을 정의할 때와 비슷하게, 함수에 객체 x를 걸어주고, 그 x에 대한 operation을 function 내부에서 정의를 해주면 된다. 이런 식으로 우리는 여러가지 함수를 만들 수 있다.


dif <- function(x,y){

return(x-y)

}


rootdif <- function(x,y){

return(sqrt(x-y))

}

여기서 dif는 x와 y값의 차이를 계산하는 함수이고, rootdif함수는 x와 y값의 차이의 제곱근을 계산하는 함수이다. sqrt는 제곱근을 시켜주는 method로 R 언어의 기본적으로 내장되어 있는 method 이다. 이런 기본적인 내장 method에 유용한 함수중 하나인 round에 대해 알아보자.


round(1.333333)

이 함수는 소수점 자리를 잡아주는 함수이다. 아무런 조건없이 소수를 round함수에 사용하면, 정수형으로 값을 return해준다. 이는 우리가 처리하고자 하는 데이터의 값이 매우 긴 소수점을 가지고 있을때, 사용하면 유용한 함수이다. 표현하고 싶은 소수점 자리를 선택하려면,


round(1.333333 , 2)

이런식으로 표현하면, 소수점 2번째 자리까지 표현해 준다.


우리는 이런 여러가지 연산이 포함된 함수들을 이용할 때, 종종 부분적인 값만 계산하고 싶은 경우가 있다. 예를들면, 1부터 1씩 값을 더해가는데, 100을 넘지 않는 값만 출력하고 싶다면, 우리는 loop문을 이용하여 연산을 처리할 수 있다.


for (i in 1:10000){

print(i)

i<- i+1

if (i >100){

break

}

}

위의 코드를 보자. for문 이라는 반복문이 사용되었다. i 의 값에 1부터 10000의 범위내에서 하나씩 입력한다. 처음 입력된 값을 출력하고, 그 아래 i <- i+1 에 따라 i값을 하나씩 올린다. 만약 그 값이 (if 조건문) 100을 넘는다면, 멈추게 된다. 현재 값은 2가 나와 100을 넘지 않으므로 다시 for문을 반복하게 된다. C언어에서 공부한 반복/조건문과 비슷하게 작동된다. R언어 역시 While문을 이용하여, 반복문을 만들 수 도 있다.


y=0

while(!y>=100){

print(y<-y+1)

}

위의 for문을 아래와 같이 while문으로도 표현할 수 있다.


이렇게 함수에 생성과 loop문에 대해 잠깐 알아보았다. 그럼 이제, Data 생성에 대해 알아보자. 먼저 우리는 기존의 Data를 불러오는 작업을 할 것이다. 우리는 보통 통계분석을 할때 사용하는 데이터의 형식을 xls 파일이나, csv 파일을 많이 사용한다. 그중에서도 csv파일은 매우 많이 사용되므로, 보통 xls파일에서 확장자를 csv파일로 변환하여 사용하기도 한다. 그럼 csv 파일을 불러오는 작업을 해보자.

나는 공공데이터 포털에서 제공하는 '국민건강데이터'에서 성별과 무게 변수만 추출하여 csv 파일을 아래와 같이 만들었다. 이 파일로 예제를 풀어보자.

이 데이터의 특징은 성별은 범주형, 몸무게는 연속형으로 표현되어 있다. (단위는 kg) 남성은 간단하게 m 이라고 표기하였고, 여성은 f라고 표기하였다. 본래 이 데이터는 연령대, 혈압, 당뇨 등 여러가지 데이터를 가지고 있었으나, 예제를 쉽게 접근하기 위해 편집하였다. 먼저 이 data파일을 R 으로 불러오자.


weight <- read.table(file="weight.csv", sep=",", na=" " , header=TRUE)

weight1<- read.csv("weight.csv")

위와 같이 두가지 방법으로 불러올 수 있다. 먼저 read.table방법을 사용하였다. 이 방법은 여러가지 확장자에 대해 사용이 가능하다. file 에는 파일이름을 sep 는 각 변수간의 간격을 무엇으로 표현할지 쓴다. 그리고 header는 첫번째 줄도 data를 불러올 것인지 결정한다.

파일을 불러올 때, 중요한것 중 하나는 파일이 어느 폴더에 위치해 있는지가 중요하다. R언어 에서는 setwd 라는 함수를 이용해 working directory를 지정한 후 해당 폴더에 있는 파일을 불러 올 것이다. 나는 weight.csv 파일을 C:\Users\jckim\Desktop\Computer Science\R 이 폴더에 저장하였으므로,


setwd("C:/Users/jckim/Desktop/Computer Science/R")

weight <- read.table(file="weight.csv", sep=",", na=" " , header=TRUE)

head(weight)

dim(weight)

이와 같이 지정된 폴더에 파일을 불러올 수 있다. 내가 가져온 파일이 맞는 파일인지 확인을 해보려면 head라는 함수를 사용해 보자 ( 이 함수는 해당 data의 첫번째 부터 여섯번째 까지 data를 불러온다.) 그리고 dim이라는 함수를 사용하여 이 파일의 데이터 관측치수와 변수의 갯수도 알 수 있다. 여기서 주의할 점은 컴퓨터 주소에 \ 역슬래시가 되어 있다면, setwd를 사용할때, / 그냥 슬래시로 바꿔 줘야한다. 또한 working directory를 영어로 써 줘야 파일을 읽어 올 수 있다.

결과를 보면 head를 통해 처음 6개의 data를 불러왔고 dim을 통해 이 data의 변수가 2개 (sex 와 weight) 그리고 데이터 갯수가 758개라는 것을 알 수 있다.


이번엔 attach 함수를 이용해 보자. attach는 해당 Data Table을 계속 사용할 것이라고 선언하는 것이다. 따라서 attach를 써주게 되면, 따로 data table를 계속 선언해 줄 필요가 없다. (detach는 attach를 풀어준다) table이라는 함수를 이용해 남자(m)와 여자(f)의 데이터 빈도가 어떻게 되는지 알아보자.


attach(weight)

table(sex)

결과는 아래와 같이 남성데이터 321개 여성데이터 437개가 나왔다.

우리는 이 Data에 대한 histogram도 그려볼 수 있다. 이전에 배웠던 hist 함수를 사용해 보자.

위와 같은 결과를 환경창에서 확인 할 수 있다. hist에 $기호를 사용하여, 특정 변수의histogram도 그려볼 수 있다.


다음은 데이터의 일부를 추출 해보자. 여기서는 subset이라는 함수를 사용했다. 먼저 weight데이터에 f 데이터만 따로 추출해, 해당 데이터에 여성(f)의 평균 weight를 구해보자.


weight_f <- subset(weight, sex=='f')

mean(weight_f$weight)

조회수 2,744회댓글 0개

최근 게시물

전체 보기

bottom of page