'r'에 해당되는 글 25건

  1. 2015.10.14 R 디버깅 툴 활용하기~
  2. 2015.10.12 R 함수에서 캐시 활용하기~
  3. 2015.10.08 R 시뮬레이션 - 랜덤 변수 샘플링
  4. 2015.10.07 R의 함수 작성 및 활용~
  5. 2015.10.05 R의 split 활용
  6. 2015.10.01 R의 apply, tapply의 활용법을 알아보자~
  7. 2015.09.29 R의 lapply, sapply, vapply를 이해하자~
  8. 2015.09.25 [R 퀴즈#3] R 프로그래밍 테스트 - Air Pollution 파트 3 (1)
  9. 2015.09.23 [R 퀴즈#2] R 프로그래밍 테스트 - Air Pollution 파트 2 (1)
  10. 2015.09.21 [R 퀴즈#1] R 프로그래밍 테스트 - Air Pollution 파트 1 (1)

R 디버깅 툴 활용하기~

|



대부분의 프로그래밍 언어처럼 R에서도 디버깅 툴을 제공한다. 

R에 내장되어 있는 디버깅 툴을 살펴보도록 하자. 


traceback

간단하게 사용할 수 있는 디버깅 툴로 traceback()이 있다. 

traceback()은 함수들을 호출한 콜 스택을 보여주는 것이다. 


x 값이 할당되어 있지 않기 때문에 에러가 발생했고, 

traceback()으로 함수 호출 스택을 살펴보면 mean() 함수 하나만 나온다. 

좀 더 복잡한 선형 회귀 분석을 계산하는 lm() 함수를 살펴보자. 


lm(y ~ x)를 처리하기 위해서 eva(), eval(), model.frame() 등을 순차적으로 호출한 것을 알 수 있다. 

그러나 traceback은 함수를 어떤 순서로 호출했는지만을 알려주고 있다. 


debug

실제로 함수들을 만들었을 때 가장 많이 사용하는 것이 바로 debug와 Browse이다. 


debug(lm)를 선언하고 나면, lm()을 실행할 때마다 디버깅 모드로 들어간다. 

디버깅 모드에서는 소스 화면에 다음과 같이 해당 함수의 소스가 나타난다. 


그리고 콘솔 화면에는 한 라인씩 실행해 볼 수 있는 브라우저 창이 나타난다. 


help를 입력하면 사용할 수 있는 명령어를 확인할 수 있다. 

n을 입력하면, 한 줄씩 실행하면서 결과를 확인할 수 있다. 

s는 해당 소스가 실행하는 함수가 있을 경우, 그 안으로 다시 들어가는 역할을 한다. 

c는 전체 소스 실행을 완료하고 종료하는 명령어 이고, 

Q는 소스를 실행하지 않고 바로 종료할 사용한다. 


중요한 점은 debug(lm)를 실행하고 undebug(lm)를 하지 않으면, 

lm()을 실행할 때마다 디버그 모드로 들어가므로 항상 쌍으로 debug(), undebug()를 사용하는 것이 필요하다. 


recover

에러가 발생했을 때, 바로 잡기 위해 추천을 해주는 옵션도 존재한다. 

options(error = recover)를 지정하면, 선택할 수 있는 다음과 같이 선택할 수 있는 명령이 나타난다. 


옵션을 선택하면 Browse가 가능한 디버깅 모드로 들어간다. 

빠져 나올 때는 0을 선택하면 된다. 

recover 옵션을 제거하기 위해서는 options(error = stop)으로 다시 설정하면 된다. 


미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~


신고

'Cloud&BigData > R' 카테고리의 다른 글

R 디버깅 툴 활용하기~  (0) 2015.10.14
R 함수에서 캐시 활용하기~  (0) 2015.10.12
R 시뮬레이션 - 랜덤 변수 샘플링  (0) 2015.10.08
R의 함수 작성 및 활용~  (0) 2015.10.07
R의 split 활용  (0) 2015.10.05
R의 apply, tapply의 활용법을 알아보자~  (0) 2015.10.01



Trackback 0 And Comment 0

R 함수에서 캐시 활용하기~

|



R은 대용량을 처리하기 위해 사용하고 메모리 기반으로 동작하기 때문에 캐시를 활용하는 경우가 종종 필요하다. 

특정하게 계산된 데이터를 캐시하는 예제를 살펴보기로 한다. 

캐시를 사용하기 위해서 현재의 environment가 아닌 다른 environment에서도 접근할 수 있도록 값을 할당할 필요가 있다. 

R에서 "<-" 대신  "<<-" 을 사용함으로써 이와 같이 처리할 수 있다. 


평균값을 캐시하는 함수

먼저 벡터를 저장하는 makeVector 함수를 생성하고 

여기에서 벡터값을 설정하고 가져오는 메소드와, 벡터의 평균을 저장하고 가져오는 메소드를 만들면 다음과 같다. 


숫자 벡터를 makeVector로 생성하면, 리스트로 리턴되는 set, get, setmean, getmean을 접근할 수 있다. 

"<<-" 연산자를 사용하여 x와 m값을 외부에서도 접근할 수 있도록 설정하였다. 


이제 makeVector를 통해 생성된 숫자 벡터를 통해 평균값을 캐시에서 읽어오는 함수를 구성하면 다음과 같다. 


먼저 x$getmean()으로 캐시된 평균값이 존재하는지 확인한다. 

캐시가 있을 경우, "getting cached data"를 출력하고 그 값을 리턴한다. 

없는 경우에는 mean()을 활용해 평균을 구한 다음 x$setmean(m)으로 평균을 캐시하고 리턴한다. 


실제 활용한 예제를 살펴보면 다음과 같다. 


cachemean(x)를 두번째 호출했을 때, "getting cached data" 텍스트로 캐시에서 값을 불러왔음을 확인할 수 있다. 


역행렬을 캐시하는 함수 만들어보기

위 예제는 coursera에서 Roger Peng 교수의 R Programming 수업의 과제 예제 중 하나이다. 

이것을 참고해서 행렬의 역행렬을 구하는 것을 캐시하는 함수를 직접 만들어 보기 바란다. 


1. makeCacheMatrix: 역행렬을 캐시할 수 있는 행렬을 생성하는 함수 

2. cacheSolve: makeCacheMatrix를 통해 생성된 행렬에 대해 역행렬을 계산하는 함수로서 먼저 캐시에 저장된 역행렬이 있는지 확인한다. 


이 함수는 makeVector, cachemean과 유사하게 만들면 되고, 

R에서 역행렬을 구하는 것은 solve() 함수를 활용하면 된다. 


이것은 직접 한번 만들어 보기 바란다. 


미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~


신고

'Cloud&BigData > R' 카테고리의 다른 글

R 디버깅 툴 활용하기~  (0) 2015.10.14
R 함수에서 캐시 활용하기~  (0) 2015.10.12
R 시뮬레이션 - 랜덤 변수 샘플링  (0) 2015.10.08
R의 함수 작성 및 활용~  (0) 2015.10.07
R의 split 활용  (0) 2015.10.05
R의 apply, tapply의 활용법을 알아보자~  (0) 2015.10.01



Trackback 0 And Comment 0

R 시뮬레이션 - 랜덤 변수 샘플링

|



R에서 시뮬레이션을 위해서 임의의 변수를 생성하는 경우가 종종 있다. 

이번에는 다양한 랜덤 변수를 생성하는 방식을 정리해 보려고 한다. 


Sample

가장 일반적으로 임의의 수를 생성하는 함수는 sample() 이다. 

sample() 함수는 다음과 같이 범위를 지정해 주고 추출할 수의 개수를 지정하면 된다. 


첫번째 예제는 1~10 사이의 임의의 수 4개를 추출한 것이다. 

마지막 예제는 letters에 저장된 알파벳 26자 중에서 5개를 임의로 생성한 것이다. 


만약 동일한 값이 중복해서 생성해도 된다면, 다음과 같이 replace = TRUE를 지정하면 된다. 


그리고 다음 예제를 살펴보자. 


set.seed(1)를 사용하고 있는데, 잘 보면 set.seed(1)이 호출된 다음에 sample() 함수의 결과가 동일하다. 

즉, 시뮬레이션을 할 때 동일한 값으로 계속 생성하고 싶다면 set.seed를 활용하면 된다. 

상당히 유용한 함수이니 꼭 기억해 두기 바란다. 


rnorm, dnorm, pnorm, qnorm 이해 

이제 정규분포와 같은 특정 분포를 따르는 임의의 수를 생성하는 함수를 살펴보자. 

정규분포를 따르는 함수를 생성하는 것은 rnorm() 함수가 있다. 

R 도움말에서 "rnorm"을 찾아보면, rnorm 이외에 dnorm, pnorm, qnorm 등이 나타난다. 


간략하게 살펴보면, dnorm()은 정규분포를 따르는 확률 밀도 함수의 값을 리턴하는 함수이다. 

pnorm()은 정규분포를 따르는 누적분포함수를 나타낸다. 

그리고 qnorm()은 pnorm()의 역을 나타낸다. 

임의의 수를 생성하기 전에 dnorm, pnorm, qnorm의 예를 잠시 살펴보도록 하자. 


dnorm(0)는 평균 0, 표준편차 1인 정규분포에서 x값 0의 확률을 나타낸다고 보면 된다. 

dnorm(0, mean = 4)는 평균이 4인 정규분포에서 x값 0의 확률이다. 


다음 예제를 보면 실제로 dnorm이 정규분포를 나타낸다는 것을 확인할 수 있다. 



평균과 표준편차 값을 변경해서 확인하면 더 확실하게 알 수 있다. 



pnorm()은 누적분포를 나타낸다고 했다. 

다음 예제로 실제 누적분포를 보이는지 확인할 수 있다. 


그리고 아래와 같이 pnorm(0)이 0.5를 나타냈으므로, qnorm(0.5)를 넣으면 0이 나온다. 

즉, qnorm은 pnorm의 역임을 알 수 있다. 


특정 분포를 따르는 임의의 수 생성하기 

이제 다시 시뮬레이션으로 돌아와서 정규분포를 따르는 임의의 수는 rnorm()으로 생성할 수 있다. 

이항분포를 나타내는 임의의 수는 rbinom()으로, 포아송 분포를 나타내는 임의의 수는 rpois()로 생성할 수 있다. 


rnorm()의 첫번째 인수는 생성할 임의의 수의 개수이고, 두번째는 평균, 세번째 인수는 표준편차이다. 

마지막 summary(x)를 보면 산술평균이나 중앙값이 20에 가까운 것을 알 수 있다. 


포아송 분포는 단위 시간에 어떤 사건이 몇 번 발생할 것인지를 나타내는 이산 확률 분포다. 

여기에서는 두번째 인수로 람다(lamda)값을 지정하는데, 이것이 바로 어떤 사건이 일어날 회수에 대한 기대값이다. 


이항 분포는 세번째 인수로 확률을 지정한다. 

아래 예제는 1이 0.5의 확률로 나오도록 임의의 수를 생성한 것이다. 


당연히 확률분포를 따르는 경우에도 set.seed()를 통해서 계속 동일한 값이 나오도록 구성할 수 있다. 

마지막으로 rnorm을 통해서 선형 모델을 구성하는 예졔를 살펴보기로 하자. 


y= b + ax + e 형태의 선형 모델이고, 각각의 변수 x와 e는 rnorm()으로 임의로 생성했다. 

plot()을 통해 결과를 살펴보면 우상향 직선으로 선형 모델이 만들어졌음을 확인할 수 있다. 


미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~


신고

'Cloud&BigData > R' 카테고리의 다른 글

R 디버깅 툴 활용하기~  (0) 2015.10.14
R 함수에서 캐시 활용하기~  (0) 2015.10.12
R 시뮬레이션 - 랜덤 변수 샘플링  (0) 2015.10.08
R의 함수 작성 및 활용~  (0) 2015.10.07
R의 split 활용  (0) 2015.10.05
R의 apply, tapply의 활용법을 알아보자~  (0) 2015.10.01



Trackback 0 And Comment 0

R의 함수 작성 및 활용~

|



이번에는 R의 함수에 대해서 살펴보도록 하자. 

일반적인 C나 자바의 함수와 유사하기 때문에 큰 어려움은 없을 것이다. 


R 함수는 다음과 같은 형태로 만들 수 있다. 

f <- function(arguments) {
## 함수 내용 작성
}


R 함수의 인수(argument)

R 함수에서 사용하는 인수중 먼저 "..." 부터 살펴보도록 하자. 

R 도움말에서 "..."을 처음 봤을때, 이게 뭔가 했던 기억이 있다. 

"..." 은 인수로 갯수에 상관없이 여러개가 넘어 올 수 있다는 것을 나타낸다. 


대표적으로 문자열을 결합하는데 사용하는 paste를 통해 알아보자. 

paste 함수의 구조는 다음과 같다. 


앞부분에 "..."이 있는 것은 연결해야 할 문자열의 개수를 미리 지정할 수 없기 때문이다. 

그래서 아래 예제와 같이 2개나 5개의 문자열을 한번에 연결할 수 있다. 

만약 연결할 구분자로 sep를 지정할 경우에는 두번째 경우와 같이 sep라는 이름을 정확하게 지정해 줘야한다. 


paste()를 통해서 "..." 인수를 살펴봤지만 아래와 같이 이름과 성을 붙이는 경우 등 많이 사용하므로 잘 알아두자. 


그리고 R에는 기본값이 설정된 인수들이 많다. 

기본값이 지정되어 있을 경우, 해당 값을 넣지 않으면 기본값으로 결과를 리턴한다. 

정규분포를 따르는 임의의 수를 생성하는 rnorm()의 경우, 평균과 표준편차가 기본값으로 각각 0과 1로 지정되어 있다. 


R 함수 만들기 

이제 본격적으로 R 함수를 직접 만들어보면서 테스트해보도록 하자. 

R에는 mean이라는 평균을 구하는 함수가 있지만, 데이터 합을 개수로 나누는 평균 함수를 직접 만들어보자. 


평균을 구하기 위해 인수 my_vector의 합을 구하고, 그 값을 my_vector의 길이로 나눈 것이다. 

벡터 값 c(3, 4, 5)를 입력으로 결과를 테스트하면 잘 나오는 것을 확인할 수 있다. 


이어서 인수의 기본값을 가지는 함수를 만들어 보자. 

나머지를 구하는 함수를 만들면 다음과 같다. 분모를 기본값으로 2로 설정한 부분을 잘 살펴보기 바란다. 


remainder(divisor = 3, 5)와 같이, 인수의 이름을 지정할 경우 순서대로 작성하지 않아도 된다. 

그러나 인수 이름을 지정하지 않았을 때는 반드시 함수의 인수 순서대로 값을 넣어줘야 한다. 


마지막으로 인수로 함수를 사용하는 경우를 만들어보자. 

evaluate 함수는 인수로 넘어온 함수를 그대로 실행하는 함수이다. 


이런 경우, 기본적인 함수를 지정해도 되지만, 

인수에 바로 새로운 함수를 작성하는 익명 함수도 적용할 수 있다. 

두 번째 인수의 값에 1을 더해 출려하는 익명 함수와 

벡터 c(3, 4, 5)로 넘어온 인수의 마지막 값을 출력하는 익명 함수 등이 가능하다. 


함수를 함수의 인수로 넘길 수 있다는 점을 기억해 두기 바란다. 


미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~


신고



Trackback 0 And Comment 0

R의 split 활용

|



R의 apply 함수들을 살펴봤는데 이와 함께 사용할 수 있는 유용한 split() 함수에 대해서 알아보도록 하자. 

split

split은 말 그대로 데이터를 나누는 함수이다. 

벡터, 리스트, 데이터셋과 같은 객체를 지정된 팩터(factor)에 따라 분리하는 기능을 한다. 


split을 이해하기 위해서 먼저 데이터를 생성해보자. 

rnorm(10)을 이용해서 평균 0, 표준편차 1인 정규분포의 수 10개를 생성하고, 

runif(10)를 이용해서 균등분포를 갖는 10개의 수를 만들고, 

rnorm(10, 1)을 통해 평균 1, 표준편차 1인 정규분포의 임의의 숫자 10개를 만든다. 


그리고 gl(3, 10)을 통해 3개의 팩터(factor)1, 2, 3에 해당하는 각각의 수 10개를 만든다. 

이후 split(x, f)로 임의의 수 30개를 각각 10개씩 분리했다. 


이렇게 분리한 데이터에서 대해 각각의 팩터에 대한 평균을 구할 경우, 

다음과 같이 lapply를 적용할 수 있다. 


데이터셋에 Split 적용

이번에는 데이터 셋을 가지고 생각해 보자. 


공기의 오염도를 나타내는 airquality 데이터셋을 가져와서 월별로 평균을 구한다고 가정해 보자. 

이때 위처럼 split을 적용하면 airquality 데이터를 airquality$Month로 분할할 수 있다. 

그리고 lapply를 통해 "Ozone", "Solar.R", "Wind" 필드에 대해 평균을 구하면 다음과 같다. 


결과를 리스트가 아닌 벡터로 활용하기 위해서는 sapply를 사용하면 된다. 

그리고 NA 값을 제외하고 싶은 때는 na.rm = TRUE를 지정해서 월별 평균을 최종적으로 구할 수 있다. 


좀 더 복잡한 경우를 생각해 보자. 

오존 오염도가 월별로 가장 높은 날짜(월, 일)와 해당 오존 오염도를 출력해보는 예제를 만들어보자. 

이 경우, 데이터 셋을 월별, 오존 오염도 순으로 정렬을 해야 하고

정렬된 데이터에 월별로 split을 적용한 다음, 

lapply나 sapply로 월, 일, 오존 오염도를 출력하면 된다. 


최종 결과는 다음과 같이 나오면 된다. 


여러가지 방법이 있겠지만 지금까지 정리한 내용으로 구성한 소스는 다음과 같다. 


sapply를 적용하니 행과 열이 반대로 나와서 do.call(rbind...)를 사용했다. 

더 나은 방법이 있으면 댓글로 남겨주기 바란다~~


미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~


신고



Trackback 0 And Comment 0

R의 apply, tapply의 활용법을 알아보자~

|



지난번엔 R의 lapply, sapply, vapply를 살펴봤다. 

이어서 다른 종류의 apply를 알아보도록 하자. 


apply

lapply와 sapply는 모두 리스트를 입력으로 받아서 각 리스트에 함수를 적용한다고 했다. 

만약 리스트가 아닌 행렬(matrix)을 입력으로 넣으면 어떻게 될까? 


rnorm()으로 평균 0, 표준편차가 1인 정규분포를 갖는 20x10 행렬을 만들었다. 

그리고 lapply로 평균을 구해보니, 결과가 무려 200개의 리스트가 나온다. 

즉, 행렬의 각각의 요소를 리스트의 개별 요소로 보고 처리한 것이다. 


보통 행렬에서는 각각의 행이나 열에 대해 함수를 적용하는 것이 필요하다. 

이런 경우에 apply를 사용하면 된다. 


apply 함수의 두번째 인자로 1을 넣으면 행(row)에 대한 함수를 적용하고, 

2를 넣으면 열(column)에 대해 함수를 적용하게 된다. 

위 예제에서 apply(x, 2, mean)은 열에 대한 평균값을 구했고, apply(x, 1, sum)은 행에 대한 합계를 구한 것이다. 


즉, 행렬에 대해 반복적으로 함수를 적용해야 할 경우에는 apply를 사용하면 된다. 

보통 이렇게 행이나 열에 대해 평균이나 합계를 구하는 경우가 많기 때문에, R에서는 이것을 별도의 함수로 제공한다. 


바로 rowMeans, colMeans, rowSums, colSums 이다. 

위 예제를 보면 결과가 동일한 것을 알 수 있다. 

참고로 속도 측면에서도 apply보다 더 빠르다고 한다. 


tapply

처음에는 tapply가 테이블 즉, 행렬에 적용되는 것인 줄 알았다. 

tapply는 리스트나 행렬, 데이터셋의 특정 요소(factor)를 기준으로 함수를 수행하는 역할을 한다. 

먼저 다음과 같이 변수들을 만들어 보자. 


rnorm은 정규분포를 만는 것으로 rnorm(10)은 평균 0, 표준편차가 1이고, rnorm(10, 1)은 평균  1, 표준편차가 1인 수를 10개씩 만드는 것이다. 

runif(10)는 균등분포를 만드는 함수로서 최소값 0과 최대값 1 사이의 10개의 수를 만든다. 

그리고 gl(3, 10)은 Factor Level을 생성하는데, 여기에서는 1, 2, 3 세 개의 Factor에 각각 10개씩 만들었다. 


이제 tapply를 적용해 보자. 


세 개의 Factor Level에 대해 각각의 평균을 구하도록 tapply를 사용했다. 

simplify는 기본값으로 true로 되어 있으며, 이 경우 sapply와 동일하게 벡터로 결과값을 리턴한다. 

두 번째 예제처럼 simplify를 false로 지정하면 lapply와 동일하게 동작한다. 


평균값을 구하는 mean이외에도 범위를 구하는 range 등을 활용할 수 있다. 

이럴 경우에는 값이 벡터 형태로 리턴할 수 없으므로 simplify는 무시하게 된다. 


실제로 tapply는 데이터셋에 대해 주로 사용한다. 

먼저 데이터셋 처리 함수에서 살펴본 mtcars를 가지고 살펴보자.


실린더 수(cyl)에 따른 각 행의 개수는 table(mtcars$cyl)로 바로 가져올 수 있었다. 

하지만, 만약에 실린더 수에 따른 mpg 값의 평균을 구해야 한다면 어떻게 할까? 

아마도 실린더 수에 따라 데이터 셋을 나누고, 각각 분할된 데이터에 대해 평균을 구하려고 할 것이다. 

이런 경우에 tapply를 사용하면 된다. 


tapply를 알면 정말 쉽게 데이터셋을 다룰 수 있다. 

반드시 그 활용을 이해해 두기 바란다. 

참고로 위 예제는 다음과 같이 표현할 수도 있다. 


다른 데이터셋으로도 한번 살펴보자. 

iris라는 붓꽃의 데이터셋도 mtcars처럼 R에 포함되어 있다. 


iris 데이터셋은 품종(setosa, versicolor, virginica)에 대해 각각 꽃받침과 꽃잎의 길이와 너비를 저장한 데이터이다. 

만약 품종이 setosa인 꽃받침 길이의 평균을 구할 경우 어떻게 해야 할까?

아니면 품종이 setosa인 꽃받침과 꽃잎의 길이와 너비의 평균을 구할 경우에는 어떻게 할까?


첫번째의 경우는 데이터셋의 일부를 가져와서 평균을 구하면 된다. 

두번째 경우에는 앞서 배운 apply나 colMeans를 사용해서 처리할 수 있다. 


마지막으로 품종별 꽃받침 길이의 평균을 구해야 한다면, Factor Level을 사용하는 tapply로 간단하게 해결할 수 있다. 

미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~


신고



Trackback 0 And Comment 0

R의 lapply, sapply, vapply를 이해하자~

|



R에는 lapply, sapply, vapply, apply, tapply등 다양한 apply 함수들이 존재한다.

데이터 분석에서 "Split-Apply-Combine" 이라는 전략을 구현한 것이 바로 apply이다. 

즉, 데이터셋을 나누어서 각 조각들을 만들고, 각각의 조각에 특정 함수를 적용하고, 결과를 합쳐서 제공한다는 것이다. 


lapply

먼저 lapply부터 살펴보자. 

lapply의 l은 리스트를 나타낸다. 즉, 입력으로 리스트를 받아서 결과로 리스트를 제공한다는 것이다. 


lapply를 테스트하기 위해 먼저 리스트를 만들어 보자. 


rnorm은 정규 분포를 따르는 수를 만드는 것으로, rnorm(10)은 기본값으로 평균 0, 표준편차 1인 정규분포를 갖는 10개의 수를 만든다. 

리스트의 각 항목, 여기에서는 a와 b에 대해 각각의 평균을 구한다고 생각해 보자. 

for 문과 같은 반복문을 통해서 각각의 평균을 구할 수도 있겠지만, 

앞서 이야기한 "Split-Apply-Combine"을 활용한 lapply로 한번에 평균을 구할 수 있다. 


lapply(x, mean)은 x 리스트의 각 요소에 대해 mean() 함수를 적용하라는 것이다. 

결과를 확인해보면, a와 b 각각의 평균을 보여주는 것을 알 수 있다. 

class() 함수를 결과값을 확인하면, 역시 리스트로 전달되는 것을 알 수 있다. 


경우에 따라서는 결과값을 리스트가 아닌 벡터 형태로 사용할 필요가 있다. 

그래서 as.dobule(x_list)로 결과를 벡터로 변경하면 다음과 같다. 


이와 같이 리스트로 결과를 리턴하지 않고 벡터로 바로 리턴해 주는 것이 바로 sapply이다. 


sapply

sapply에서 s는 simplify를 나타낸다. 즉, 결과를 벡터 형태로 단순화해서 리턴한다는 것이다. 

위에서 as.double(x_list)를 통해 길이가 2인 벡터를 가져오는 부분을 sapply로 한번에 처리하면 다음과 같다. 


즉, sapply는 lapply와 동일하게 리스트를 입력으로 받아서 각각의 항목에 지정된 함수를 적용한다. 

다만 유일한 차이점은 결과값을 리스트가 아닌 벡터 형태로 리턴한다는 점이다. 


다음 예제를 한번 생각해보자. 

lapply에 적용하는 함수를 익명함수로 각각의 원래 값에 1을 더하는 것으로 적용해보면 다음과 같다. 


결과를 보면 리스트 각각의 길이가 서로 다르다. 

이 경우, 과연 sapply를 적용하면 어떻게 될까? 

길이가 다르기 때문에 하나의 벡터로 합치는 것이 어렵다. 그래서 다음과 같이 sapply도 lapply와 동일하게 리스트를 리턴하게 된다. 


vapply

벡터로 결과를 가져오는 것을 기대했는데, 위처럼 리스트가 결과로 나타나면 문제가 되는 경우도 있다. 

이런 경우, 차라리 결과가 나오지 않고 에러를 발생하는 것이 필요할 수도 있다. 


이럴때 사용하는 것이 바로 vapply이다. 

vapply는 함수 결과값의 벡터 형태를 미리 지정하고, 해당 형태가 아닐 경우, 에러를 발생시킨다. 


결과값이 동일한 mean 함수를 적용할 때는 sapply와 똑같이 결과가 나왔지만, 

결과값이 서로 다른 익명 함수에서는 에러가 발생한 것을 확인할 수 있다. 


미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~


신고



Trackback 0 And Comment 0

[R 퀴즈#3] R 프로그래밍 테스트 - Air Pollution 파트 3

|



존스 홉킨스 대학의 로저 펜(Roger, D. Peng) 교수의 R 프로그래밍 강좌의 프로그래밍 테스트를 한글로 옮겨본다. 

R 프로그래밍을 배우는 사람들은 한번씩 테스트 해보기 바란다. 



데이터 

본 예제에서 사용하는 데이터를 다음 링크에서 다운로드 한다.

invalid-file


문제 - 오염된 값 사이의 상관관계 계산하기

마지막으로 지정된 파일을 읽어서 오염된 값 sulfate와 nitrate의 상관관계를 계산하는 함수를 만들어 보자. 

단, 각 파일(모니터링 아이디)별로 sulfate와 nitrate의 값이 모두 존재하는 경우의 수가 매개변수로 지정된 임계치(threshold)보다 큰 값만 대상으로 한다.  

결과값으로 임계치(threshold) 조건을 만족하는 모니터링 아이디의 상관관계 값의 벡터를 리턴한다. 

만약 모든 모니터링 아이디가 임계치 조건을 만족하지 못한다면, 길이가 0인 숫자 벡터를 리턴하면 된다. 

함수의 프로토타입은 다음과 같다. 

corr <- function(directory, threshold = 0) { ## 'directory'는 CSV 파일의 위치를 나타내는 길이가 1인 문자열 벡터 ## 'threshold'는 길이가 1인 숫자형 벡터로서 모니터링 아이디별로 ## sulfate와 nitrate의 값이 모두 존재하는 경우의 수를 계산할 임계치 ## 기본값은 0 ## 결과값으로 상관계수 값의 숫자형 벡터를 리턴 ## NOTE: 결과 값을 반올림하지 말자. }


위에서 상관관계를 계산하기 위해 R에서 제공하는 cor() 함수를 사용할 필요가 있다. 

"?cor"로 도움말을 살펴보기 바란다. 

위 파일을 corr.R 로 저장하고 다음의 결과와 동일하게 나오면 된다. 

source("corr.R")
source("complete.R")
cr <- corr("specdata", 150)
head(cr)
## [1] -0.01896 -0.14051 -0.04390 -0.06816 -0.12351 -0.07589
summary(cr)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -0.2110 -0.0500  0.0946  0.1250  0.2680  0.7630
cr <- corr("specdata", 400)
head(cr)
## [1] -0.01896 -0.04390 -0.06816 -0.07589  0.76313 -0.15783
summary(cr)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -0.1760 -0.0311  0.1000  0.1400  0.2680  0.7630
cr <- corr("specdata", 5000)
summary(cr)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 
length(cr)
## [1] 0
cr <- corr("specdata")
summary(cr)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -1.0000 -0.0528  0.1070  0.1370  0.2780  1.0000
length(cr)
## [1] 323


스스로 프로그래밍을 하고 결과를 확인해 보기 바란다. 

댓글로 질문은 자유롭게 올려주시고, 다른 사람들을 위해서 정답은 올리지 말자~~


미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~


신고



Trackback 0 And Comment 1

[R 퀴즈#2] R 프로그래밍 테스트 - Air Pollution 파트 2

|



존스 홉킨스 대학의 로저 펜(Roger, D. Peng) 교수의 R 프로그래밍 강좌의 프로그래밍 테스트를 한글로 옮겨본다. 

R 프로그래밍을 배우는 사람들은 한번씩 테스트 해보기 바란다. 


데이터

데이터는 다음 링크에서 다운로드 하면 된다. 

invalid-file


문제 - 오염된 값을 모두 측정한 경우의 수 계산

지정된 디렉토리의 파일들을 읽어서, 각 파일 내에 "sulfate"와 "nitrait"값이 모두 측정된 경우의 수를 계산하는 함수를 작성한다. 

함수의 결과값으로 반드시 데이터 프레임을 리턴하도록 한다. 

첫번째 칼럼은 파일 이름, 즉 모니터링 아이디(ID) 값으로 하고, 두번째 칼럼은 오염된 값을 모두 측정한 수로 한다. 

함수의 프로토타입은 다음과 같다. 

complete <- function(directory, id = 1:332) { ## 'directory'는 CSV 파일의 위치를 나타내는 길이가 1인 문자열 벡터 ## 'id'는 계산에 사용할 모니터링 아이디 값을 나타내는 정수형 벡터 ## 결과값으로 리턴할 데이터프레임의 형식: ## id nobs ## 1 117 ## 2 1041 ## ... ## 'id'는 모니터링 아이디, 'nobs'는 오염 값을 모두 측정한 경우의 수 }


위 파일을 complete.R로 저장하고 다음 결과와 동일하게 나오면 된다. 

source("complete.R")
complete("specdata", 1)
##   id nobs
## 1  1  117
complete("specdata", c(2, 4, 8, 10, 12))
##   id nobs
## 1  2 1041
## 2  4  474
## 3  8  192
## 4 10  148
## 5 12   96
complete("specdata", 30:25)
##   id nobs
## 1 30  932
## 2 29  711
## 3 28  475
## 4 27  338
## 5 26  586
## 6 25  463
complete("specdata", 3)
##   id nobs
## 1  3  243


스스로 프로그래밍을 하고 결과를 확인해 보기 바란다. 

댓글로 질문은 자유롭게 올려주시고, 다른 사람들을 위해서 정답은 올리지 말자~~



미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~


신고



Trackback 0 And Comment 1

[R 퀴즈#1] R 프로그래밍 테스트 - Air Pollution 파트 1

|



존스 홉킨스 대학의 로저 펜(Roger, D. Peng) 교수의 R 프로그래밍 강좌의 프로그래밍 테스트를 한글로 옮겨본다. 

R 프로그래밍을 배우는 사람들은 한번씩 테스트 해보기 바란다. 



데이터 

본 예제에서 사용하는 데이터를 다음 링크에서 다운로드 한다.

specdata.zip


압축을 풀면 332개의 CSV 파일이 specdata 폴더에 존재한다. 

미국의 332개 지역의 공기 오염 상태를 모니터링하는 데이터로서, 각각의 파일에 모니터링 지역의 ID 값을 가지고 있고 그 ID 값으로 파일 이름을 사용하고 있다. 

각 파일의 내부에 포함된 내용은 다음과 같다. 

  • Date: the date of the observation in YYYY-MM-DD format (year-month-day)
  • sulfate: the level of sulfate PM in the air on that date (measured in micrograms per cubic meter)
  • nitrate: the level of nitrate PM in the air on that date (measured in micrograms per cubic meter)

  • 문제 - 오염된 평균 값 계산하기

    첫번째 문제는 지정된 지역의 데이터 셋을 파일에서 읽어들여서, 오염값 (sulfate or nitrate)의 평균을 계산하는 pollutantmean 함수를 만드는 것이다. 

    pollutant 함수는 "directory", "pollutant", "id"라는 세 개의 인수를 가지고 있다. 

    "directory"에 지정된 폴더에서 "id"에 해당하는 파일들을 읽고, "pollutant"에 해당하는 값들의 평균을 구하면 된다. 

    물론 해당 값이 NA 일 경우에는 제외하고 평균을 구하면 된다. 


    함수의 프로토타입은 다음과 같다. 

    pollutantmean <- function(directory, pollutant, id = 1:332) { ## 'directory'는 CSV 파일의 위치를 나타내는 길이가 1인 문자열 벡터 ## 'pollutant'는 길이가 1인 문자열 벡터로서 오염된 항목의 이름을 나타냄 ## 해당 항목의 평균을 구하는 것으로 "sulfate"나 "nitrate" 중 하나의 값을 가짐 ## 'id'는 평균 계산에 사용할 모니터링 아이디 값을 나타내는 정수형 벡터 ## 'id' 벡터의 모니터링 리스트에 있는 모든 오염된 값의 평균을 리턴 ## 단, NA 값은 무시 ## NOTE: 결과 값을 반올림 하지 말기 바람 }


    위 파일을 pollutatnmean.R 로 저장하고 다음의 결과와 동일하게 나오면 된다. 

    source("pollutantmean.R")
    pollutantmean("specdata", "sulfate", 1:10)
    
    ## [1] 4.064
    
    pollutantmean("specdata", "nitrate", 70:72)
    
    ## [1] 1.706
    
    pollutantmean("specdata", "nitrate", 23)
    
    ## [1] 1.281


    스스로 프로그래밍을 하고 결과를 확인해 보기 바란다. 

    댓글로 질문은 자유롭게 올려주시고, 다른 사람들을 위해서 정답은 올리지 말자~~


    미니의 R 주요 강좌...

    데이터 통계 분석을 위한 R 설치와 활용

    R 실행을 위한 기본적인 내용들~

    R 데이터 구조에 대한 정리

    R 패키지 설치하기

    R 데이터셋 처리 함수들에 대한 간단한 정리~

    R 데이터셋 정렬하기~

    R 데이터셋의 일부 데이터 가져오기

    R의 lapply, sapply, vapply를 이해하자~

    R의 apply, tapply의 활용법을 알아보자~

    R의 split 활용

    R의 함수 작성 및 활용~

    R 시뮬레이션 - 랜덤 변수 샘플링

    R 함수에서 캐시 활용하기~

    R 디버깅 툴 활용하기~


    신고



    Trackback 0 And Comment 1
    prev | 1 | 2 | 3 | next