티스토리 뷰

노트/Junk 폐기

R 입문 및 기초 프로그래밍

Jae-seong Yoo 2012. 3. 17. 20:33
□ R을 사용하기 위한 주요 사항
  R은 대화식 프로그램으로, 프로그램의 입력이 준비되었음을 나타내는 '>' 이후에 함수 등을 이요하여 프로그램을 입력하고 Enter를 누르면 그 행의 프로그램이 수해되어 출력결과가 나타난다. 만약 프로그램에 오류가 있을 경우에는 오류 메시지가 출력된 후 다시 프로그램 입력 준비를 나타내는 '>' 이후에 커서가 대기한다.

○ 기초 연산자
 

  - R에서 주석(comment)는 '#'으로 표시하며, #으로 시작된 이후의 문장은 프로그램 실행에서 무시된다.
  - 연산의 우선순위를 나타내는 소괄호(()), 중괄호({}), 대괄호([]) 중 대괄호는 R 프로그램 내에서 특수한 역할이 정의되어 있으므로 사용할 수 없다. 추가로 중괄호의 경우에도 문법적 오류는 없으나 프로그램 내에서 정의된 역할이 있으므로 되도록이면 사용을 자제하도록 한다.
  - R은 보통 한 줄에 명령어를 입력하게 되지만, 명령어의 길이가 길 경우에는 연결 프롬프트로 '+'가 '>' 대신 나타나게 된다. 이는 Enter를 통해 명령어를 입력받은 R이 입력된 명령어가 불완전할 경우 자동적으로 생성한다. 따라서 연결 프롬프트로 '+' 이후에 이어지는 프로그램을 입력하면 된다.
  - 한 가지 명령문의 마침은 ';'으로 구분한다. 따라서 한 행에 두 가지 이상의 명령문을 연이어 작성할 경우에는 ';'을 이용하여 각 명령문의 종료를 나타내도록 한다.

  사칙연산에 대한 연산자나 연산자간의 우선순위는 일반적인 프로그램이 언어에서의 그것과 크게 다르지 않으며, 소괄호를 통해 제어할 수 있다.


  출력 결과에는 '[1]'이 항상 표현됨을 알 수 있는데, 이는 출력물인 데이터에 대한 인덱스(index)로, 결과를 확인하는 데 있어 유용하게 쓰인다. 가령 아래와 같이 '1:100'은 1에서 100까지의 정수를 만드는 명령문으로, 그 결과를 보면 인덱스를 통해 51번째 출력 값이 51임을 쉽게 알 수 있다.

 

○ 수학 함수
  - abs(x) : x 절대값
  - ceiling(x), floor(x), trunc(x) : 버림 함수들로, 각각 x보다 큰 수 중 가장 작은 정수, x보다 작은 수 중 가장 큰 정수, 0과 x 사이의 가장 큰 정수를 출력한다.
  - round(x, digits = y), signif(x, digits = y) : x의 반올림 함수들로 각각 x의 소수점 y자리에서의 반올림(디폴트 y = 0), 10의 지수형태의 표현으로 반올림(디폴트 y = 6) 한다. 그러나 주의할 점은 아래와 같이 round 함수는 국제전기기술위원회(IEC)에서 정한 국제규격을 따르고 있고 signif는 국제규격을 따르지 않아 결과가 다를 수 있다. 

  - exp(x) : 지수함수(exponential function)
  - log(x), log10(x), log2(x), logb(x, base=y) : 로그함수로, 각각 밑(base)이 자연대수, e, 10, 2, x인 로그함수
  - sign(x) : 부호함수 
  - sqrt(x) : 제곱근 함수
  - factorial(x) : x의 계승 (x!)
  - choose(x, y) : x에서 y를 고르는 조합의 수 (x C y)
  - pi : 원주율
  - sin(x), cos(x), tan(x) : 삼각함수 sin, cosin, tangent


○ 객체(object)의 명명 규칙
  - 문자 a~z, A~Z와 숫자 0~9, 그리고 '.', '_'의 조합으로 구성한다.
  - 첫 문자로 숫자와 '_'은 사용할 수 없다.
  - if, for c, pi와 같은 R 프로그램의 예약어는 사용할 수 없다.
  - 동아시아 버전(East Asian)을 설치한 경우, 한글을 사용할 수 있다.
  - 대소문자를 구분한다. 이는 함수의 경우도 마찬가지로 As()와 as()는 서로 다른 함수이다.)
  - 최대 256문자까지 사용하는 것이 가능하다.


 ○ 할당(assignment)

  변수의 객체에 값을 정의하는 것을 값이나 데이터를 할당한다고 하는데, 이 때 사용하는 '=', '<-', '<<-'을 할당 연산자라고 한다.
  - '=', '<-'은 연산자의 오른쪽의 값을 왼쪽 객체에 할당한다.
  - '<<-' 연산자도 위와 유사하게 사용되나, 함수 내에서 이 할당 연산자를 사용하였을 경우 객체에 값이 유지된다.



 ○ 객체(object)의 관리

  - ls(name, pos = -1, envir = as.environment(pos), all.names = FALSE, pattern)
     여기서
     name : 문자열 또는 숫자로 소속된 객체를 나열할 패키지 이름으로, 'package:base"와 같이 정의. default는 workspace.
     pos : name의 대체적인 정의 방법으로, search() 함수의 결과 리스트 참조하여 패키지의 번호로 정의
     envir : name의 대체적인 정의 방법으로, search() 함수의 결과 리스트 참조하여 as.environment() 함수를 이용 패키지의 번호로 정의      all.names : 논리값(TRUE, FALSE)으로 FALSE일 경우는 객체 이름 중 '.'으로 시작하는 부분 생략
     pattern : 문자로 객체 이름 중 정의된 패턴을 갖는 경우만 출력
  - object(name, pos = -1, envir = as.environment(pos), all.names = FALSE, pattern)
     여기서
     name : 문자열 또는 숫자로 소속된 객체를 나열할 패키지 이름으로, 'package:base"와 같이 정의. default는 workspace.
     pos : name의 대체적인 정의 방법으로, search() 함수의 결과 리스트 참조하여 패키지의 번호로 정의
     envir : name의 대체적인 정의 방법으로, search() 함수의 결과 리스트 참조하여 as.environment() 함수를 이용 패키지의 번호로 정의      all.names : 논리값(TRUE, FALSE)으로 FALSE일 경우는 객체 이름 중 '.'으로 시작하는 부분 생략
     pattern : 문자로 객체 이름 중 정의된 패턴을 갖는 경우만 출력
  - search() : 현재 작업환경에서 구동된 패키지들을 문자 리스트로 출력한다.
     여기서 이 출력 결과를 확인해 ls()와 object() 함수 옵션인 pos를 지정할 수 있다.
     결과 중 첫 번째의 ".GlobalEnv"는 현재 작업 환경인 워크스페이스(workspace)를 나타낸다.

  - searchpaths() : 각 패키지들의 물리적인 저장 위치를 알 수 있다.
  - as.environment() : 지정된 패키지의 속성을 나타내는 함수이다. search() 함수의 출력결과를 활용해 해당 패키지의 환경적인 속성을 출력한다.
  - rm(..., list = character(0), pos = -1, envir = as.environment(pos), inherits = FALSE) : 기존의 객체들을 삭제하는 함수
     여기서
     ... : 제거할 객체 이름 나열
     list : 제거할 객체 이름이 기록된 문자 리스트명 정의
     pos : 제거할 객체의 위치를 패키지 번호로 지정. default는 workspace.
     envir : pos의 대체적인 정의 방법으로, as.environment() 함수를 이용하여 패키지의 번호로 정의
     inherits : 논리값(TRUE, FALSE)으로 정의된 패키지 내에서만 제거할 객체를 탐색할 것인가에 대한 지정



 ○ 패키지(package)의 이용

  R 프로그램에 설치되어있는 패키지는 search() 함수 수행 결과와 같다.
  기본 패키지 이외에 필요한 패키지를 구동하는 함수로는 library()require()가 있다.
  예를 들어, 군집 분석과 관련된 다양한 함수들로 구성된 'cluster'라는 패키지를 구동하고자 한다면, R 콘솔 화면에 library(cluster)를 실행하면 된다. 이후 search() 함수를 통해 'cluster' 패키지가 구동되었음을 확인할 수 있다.

  R 콘솔 화면의 풀 다운 메뉴 중, 패키지패키지 불러오기를 사용하여도 동일한 기능을 수행할 수 있다.


 ○ 도움말(help)의 이용

  R의 장점 중 하나는 강력한 도움말 기능이다. R 프로그램을 작성하면서 다양한 함수들을 접하게 되는데, 각 함수의 기능이나 필요한 인수들에 대한 내용은 도움말을 통해 손쉽게 얻을 수 있다.
  도움말을 사용하는 방법은 부록의 풀 다운 메뉴의 도움말 기능을 살펴보면 된다. 또는 help() 함수를 이용할 수 있고, 도움말 중 원하는 단어를 포함하는 내용을 검색하고자 할 경우에는 help.search() 함수도 유용하게 사용할 수 있다.
  - apropos(what, where = FALSE, mode = "any") : help() 함수와 유사하나 부분적으로 주어진 단어를 포함하는 객체들을 검색하는 함수이다. 
     여기서
     what : 검색할 객체나 문자
     where : 논리값(TRUE, FALSE)으로 객체의 위치를 나타내는 패키지 번호의 추가 출력 여부
     mode : 검색할 객체의 형식을 지정






□ 데이터 유형

○ 데이터의 기본 유형
  - 수치형(numeric) : 숫자로 이루어졌으며, 정수형(integer)과 실수형(double)으로 구분된다.
  - 논리형(logical) : 참(TRUE)이나 거짓(FALSE)의 논리값을 나타낸다.
  - 문자형(character) : 문자나 문자열을 나타낸다.
  - 복소수형(complex) : 실수와 허수로 구성된 복소수를 나타낸다.

  ※ R에서 데이터의 유형을 출력하여 주는 함수는 mode()이다.
      논리형 데이터의 경우 'TRUE' 또는 'T', 'FALSE' 또는 'F'는 논리형 데이터로 사용 가능하나, 이외의 경우(예를 들어 true, false)는 그렇지 않다.
      실수와 복소수의 연산 결과는 복소수로 처리된다.


  R은 데이터의 기본적인 속성을 데이터의 유형(mode)과 길이(length)로 나타내는데, 여기서 길이는 소속된 데이터의 개수를 나타낸다. 데이터의 길이는 length() 함수로 출력할 수 있다.


  데이터 유형 검증 함수는 아래와 같다.
  - is.numeric(x) : 수치형 여부
  - is.double(x) : 실수형 여부
  - is.integer(x) : 정수형 여부
  - is.logical(x) : 논리형 여부
  - is.complex(x) : 복소수형 여부
  - is.character(x) : 문자형 여부
  - is.na(x) : NA 여부
  - is.null(x) : NULL 여부
  - is.nan(x) : NaN 여부
  - is.finite(x) : 유한 수치 여부
  - is.infinite(x) : 무한 수치 여부


○ 특수 데이터
  R에서는 기본적인 데이터 유형으로 정의되지 않는 특수형태의 데이터를 사용한다.
  - NULL : 비어있는 값으로 데이터 유형도 없으며 자료의 길이도 0이다.
  - NA : 결측치(missing value)
  - NaN : 수학적으로 정의가 불가능한 수 (예 : sqrt(-3))
  - Inf, -Inf : 양의 무한대와 음의 무한대


○ 데이터 유형의 변경
  서로 다른 유형의 데이터에 대한 연산 결과는 R 프로그램에 의해 자동으로 하나의 유형으로 정의된다. 이러한 현상을 데이터 유형의 강제변환이라고 부른다. 값의 유형별 우선순위는 문자형 > 복소수형 > 수치형 > 논리형이다.
  이외에도 유저가 직접 데이터 유형을 변경할 수 있는데, 이 때 사용하는 함수들은 아래와 같다.
  - as.numeric(x) : 수치형으로 변환
  - as.double(x) : 실수형으로 변환
  - as.integer(x) : 정수형으로 변환
  - as.logical(x) : 논리형으로 변환
  - as.complex(x) : 복소수형으로 변환
  - as.character(x) : 문자형으로 변환





□ R의 자료 객체
  R은 여러가지 특수한 종류의 자료구조를 수용할 수 있도록 다양한 형태의 자료객체(data object)를 정의하고 있다.




○ 벡터(vector)
  하나 이상의 자료 값으로 구성된 1차원의 자료 구조를 가진 벡터는, 수치형, 문자형, 복소수형, 논리형의 자료 유형 중 오직 한 가지 유형의 데이터 입력만 가능하다.
  - 수열(sequence) 연산자 ':' : 좌우에 정의된 값을 기준으로 등차가 +1 혹은 -1인 등차수열을 생성한다. 즉, 왼쪽의 수치가 오른쪽보다 작을 경우에는 등차는 +1, 반대의 경우에는 등차가 -1인 수열이 생성된다. 자료 유형은 수치형이며, 실수형과 정수형의 구분은 ':' 왼쪽에 정의된 수치 유형에 따라 결정된다.

  - seq((from=)a, (to=)b, (by=)c, length=n, along.with=object)
     여기서
     a, b, c : 수치형인 a, b, c에 대해 a부터 b까지 c만큼씩 증가(감소)하는 자료를 생성하며 a와 c의 디폴트는 각각 1과 1 또는 -1
     length= : 출력될 자료의 크기를 n(양의 정수)으로 정의
     along.with : 정의된 객체(object)의 길이와 동일한 크기로 자료 열 생성

     ※ 만약 인수 by와 length가 동시에 정의되면, 그 정의내용이 동일한 결과를 요구한다 하더라도 error가 발생한다.

  - c(..., recursive=FALSE) : 직접 입력을 통해 데이터를 4가지 기본 자료 유형을 입력할 수 있다. 입력된 자료 열의 전체 유형은 정의된 자료에 따라 달라지는데, 서로 다른 자료 유형이 동시에 입력되었을 경우에는 자료의 유형별 우선순위에 따라 그 자료의 유형이 결정된다.
     여기서
     ... : 자료로 입력할 때 데이터의 나열
     recursive= : 입력한 자료의 결합 구조를 정의하기 위한 것으로, 디폴트는 FALSE로 함수에 나열된 데이터의 단순 결합을 나타내며, TRUE는 연결된 구조로 결합된 데이터를 생성한다.

  - paste() : 문자형 벡터의 자료 입력에 유용한 함수이다. 이는 주어진 백터의 값을 문자형으로 변환하여 결합하는 것으로, 구분은 인수 sep를 통해 정의된 문자를 기준으로 한다.

  - sequence() : 주어진 백터 객체의 각 원소에 seq() 함수를 수행하는 함수이다. 백터 객체의 데이터 원소가 실수일 겨웅에는 버림을 통해 정수화하여 수열을 생성한다.

  - rep(x, times=10, length.out=5, each=6, ...) : 주어진 백터 객체를 반복하여 자료를 생성하는 함수
     여기서
     x : 반복할 자료를 포함한 백터 객체
     times= : 정수, 반복 횟수
     length.out= : 정수, 출력 자료 객체의 길이
     each= : 정수, 백터 내 데이터 원소 각각의 반복회수로 디폴트는 1

  - scan(file="", what=double(0), nmax=-1, n=-1, sep="",
        nlines=0, quote=if(identical(sep, "\n")), flush=FALSE, fill=FALSE, strip.white=FALSE,
        quiet=FALSE, blank.lines.skip=TRUE, multi.line=TRUE, comment.char="", allowEscapes=FALSE)
     : R 콘솔 창이나 파일로부터 백터나 리스트에 자료를 입력하는 함수이다.
     만일 데이터를 불러올 파일을 정의하지 않을 경우에 scan() 함수는 화면에서 키보드를 통해 자료를 입력시킬 준비를 나타낸다.
     데이터의 원소를 구분하는 방법은 디폴트가 공백(blank) 혹은 Enter이며, 자료의 입력을 종료한 경우 Enter를 두 번 누르거나 Ctrl + Z를 이용한다.
     여기서
     file="" : 데이터를 읽어들일 외부의 텍스트 파일을 정의한다. ""로 정의된 경우에는 R 콘솔 화면의 키보드 입력을 통해 데이터를 입력한다.
     what= : 입력될 데이터의 유형을 정의하는 것으로 백터 객체로의 입력의 경우 logical, integer, numeric, complex, character 중 하나를 선택해 정의할 수 있다. 리스트 객체로 입력하는 경우는 복수 유형을 정의할 수 있으며, 정의된 what의 길이와 같은 수의 변수 값을 한 행에 포함하고 있어야 한다.
     nmax= : 입력될 데이터 원소의 최대 개수를 양의 정수로 정의한다. -1(디폴트) 등 음의 정수이거나(동시에 nline 인수도 양의 정수로 정의되지 않았을 경우) 생략되면 정의된 파일 내용 전체를 읽어온다.
     n= : 입력될 데이터 원소의 최대 개수를 양의 정수로 정의한다. 디폴트는 무제한이다.
     sep= : 데이터 원소를 구분하는 문자를 정의하는 것으로, 디폴트는 "" 혹은 입력라인의 끝(end-of-line)이다. 사용될 구분기호는 1byte 문자여야 한다.
     nlines= : 데이터를 읽어들일 행의 최대 수를 양의 정수로 정의한다.
     quote= : 입력 종료를 의미하는 한 문자나 NULL로 정의한다.
     dec= : 소수점을 나타내는 한 바이트 문자(디폴트 ".")로 정의한다.
     skip= : 데이터 입력 전에 무시할 행의 수(디폴트 0)를 정의한다.
     na.strings= : 결측치를 나타내는 문자에 대한 문자형 백터를 정의한다.
     flush= : 논리값으로 TRUE는 파일의 한 행에서 주어진 변수를 모두 입력하였을 경우 그 행의 마지막으로 이동하게 한다. 그러나 만약 한 행에 여러 관찰치의 데이터가 있다면 FALSE(디폴트)로 정의되어야 한다.
     fill= : 논리값으로 TRUE는 한 행에서 주어진 변수를 모두 입력하지 못하였다면 미입력된 변수는 NULL 값을 갖도록 한다. (디폴트는 FALSE)
     quite= : 논리값으로 FALSE(디폴트)이면 자료의 입력이 종료된 후 입력된 데이터 원소의 개수를 화면에 출력한다.
     blank.lines.skip= : 논리값으로 TRUE(디폴트)이면 입력파일 내에 비어있는 행은 무시한다. 반면 비어있는 행은 nlines 인수나 skip 인수의 정의에서 포함된다.
     multi.line= : 논리값으로 TRUE(디폴트)이면 하나의 관측치에 해당하는 변수의 데이터 값이 여러 행에 나누어져 있음을 나타낸다.

  ※ 백터 객체의 속성
     백터 개체의 속성은 자료의 유형(mode), 길이(length), 데이터 원소의 이름(names)이 있는데, 각 함수를 통해 속성을 확인할 수 있다.



○ 행렬(matrix)
  동일한 유형의 자료 값으로 구성되며, 행과 열의 2차원 자료구조를 갖는 행렬은 수치형, 문자형, 복소수형, 논리형의 자료 유형 중 한 가지 유형에 대한 데이터 입력만 가능하다.
  - cbind(..., deparse.level=1) or rbind(..., deparse.level=1)
     여기서
     ... : 결합할 백터, 행렬, 데이터 프레임 객체들로 서로 다른 유형들간의 결합도 가능하다.
     deparse.level= : 정수이며, 결합되면 열(cbind())이나 행(rbind())의 이름을 정의하는 인수로, 정의되는 값에 따라 다음과 같은 역할을 한다.
        0 : 함수 내의 정의된 이름만을 사용
        1 : 기존에 정의된 객체 이름 적용 (디폴트)
        2 : 이름의 자동 생성

  ※ 원소의 수가 일치하지 않을 경우 warning 메시지가 출력되고, missing 데이터 원소를 miss의 기존 원소 중 첫 번째 원고를 채워 넣는다.

  - matrix(data=NA, nrow=1, ncol=1, byrow=FALSE, dimnames=NULL) : 주어진 차원에 따라 행렬 객체를 생성하는 함수
     여기서
     data= : 백터 객체 이름
     nrow= : 양의 정수로, 원하는 행의 수(디폴트 1)를 정의한다.
     ncol= : 양의 정수로, 원하는 행의 수(디폴트 1)를 정의한다.
        ※ nrow와 ncol이 함께 정의되었을 경우, 백터의 길이와 nrow * ncol의 값이 일치하지 않으면 오류가 발생한다.
     byrow= : 논리값으로, FALSE(디폴트)이면 행부터 데이터를 채우고 TRUE이면 열부터 데이터를 채운다.
     dimnames= : 각 행과 열의 이름을 정의하는 길이 2의 리스트 객체로 정의된다.
  - dim() : 주어진 객체의 차원을 참조하고 그에 따라 자료구조를 변경하는 함수이다. 2차원뿐 아니라 3차원 이상의 자료구조 정의도 가능해 배열(array) 객체의 생성에도 사용되며, 데이터는 열을 우선으로 채워진다.


  ※ 행렬 객체의 속성
     행렬 객체의 속성은 자료의 유형(modes), 길이(length), 차원(dimension), 행과 열의 이름(dimnames)이 있다.



○ 데이터 프레임(data frame)
  데이터 프레임은 변수(필드)와 관찰치(레코드)로 구성된 2차원의 자료 객체로, 자료 분석에 있어 가장 일반적인 데이터 구조라 할 수 있다. 각 변수의 자료 유형은 일치하지 않아도 되지만 변수별 관찰치의 수는 동일해야 한다.
  - data.frame(..., row.names=NULL, check.rows=FALSE, check.names=TRUE) : R 프로그램 내부에서 주어진 자료 객체의 결합으로 데이터 프레임을 생성하는 함수
     여기서
     ... : 데이터 프레임으로 결합된 자료 객체
     row.names= : 관찰치(행)의 이름을 정의하는 것으로, NULL(디폴트), 정수나 문자 또는 문자형 백터가 가능하다.
     check.rows= : 논리값으로 TRUE인 경우 결합되는 객체들의 행의 길이가 동일한지 확인한다. (디폴트 FALSE)
     check.names= : 논리값으로 TRUE인 경우 결합되는 객체들의 변수(열)의 이름이 사용 가능하며, 중복되어 있지 않은지 확인한다. (디폴트 FALSE)

  - read.table(file="", header=FALSE, sep="", quote="\"'", dec=".",
        row.names, col.names, as.is=FALSE, na.strings="NA", colClasses=NA,
        nrows=-1, skip=0, check.names=TRUE, fill=!blank.lines.skip, strip.white=FALSE, blank.lines.skip=TRUE,
        comment.char="#", allowEscapes=FALSE, flush=FALSE)
     여기서
     file="" : 데이터를 읽어 들일 외부의 텍스트 파일을 정의한다.
     header= : 논리값으로 파일의 첫 행에 변수이름의 포함여부를 나타낸다. 정의하지 않을 경우 파일을 읽어들이는 과정을 통해 값이 정의되며, 만약 첫 번째 행의 원소가 (변수의 개수 -1)일 경우에만 TRUE로 정의하도록 한다.
     col.names= : 변수의 이름을 포함하는 백터로, 디폴트는 변수의 이름을 "V1", "V2" 등으로 자동 생성한다. 이 백터의 길이가 변수의 수로 정의되며 miss일 경우는 파일의 최대 5번째 행까지를 읽어 자동으로 변수의 개수를 결정한다.
     as.is= : 논리값으로 FALSE(디폴트)이면 문자형 변수에 대한 범주형으로의 전환을 나타낸다. 또는 논리값, 정수, 변수의 이름을 포함하는 문자형 백터로 정의할 수 있으며, 이에 따라 범주형으로의 전환을 방지할 변수를 정의할 수 있다. 만약 모든 변수의 범주형화를 원한다면 아래의 인수 colclasses="character"로 정의한다.
     colclasses= : 문자형으로 각 변수의 형식을 정의하는 인수로, NA, NULL과 기본 유형 및 factor, date, POSIXct의 정의가 가능하다.
     fill= : 논리값으로 TRUE로 정의되면 관찰치의 몇몇 변수값이 존재하지 않아 각 행의 길이가 다를 경우, 부족한 변수값을 빈칸(blank)으로 채운다. 변수의 개수에 대한 정의는 col.names 인수의 내용을 참고하라.