내용
R 기본과 벡터
기본사항
R은 vector, list, dataframe과 같은 데이터 구조에서 작동합니다. 가장 단순한 구조는 숫자 벡터로, 정렬된 숫자 모음으로 구성된 단일 엔터티입니다. 5개의 숫자, 즉 10.4, 5.6, 3.1, 6.4 및 21.7로 구성된 x라는 벡터를 설정하려면 R 명령을 사용합니다.> x<-c(10.4, 5.6, 3.1, 6.4, 21.7); x [1] 10.4 5.6 3.1 6.4 21.7함수 c()는 내부의 요소들을 연결하고 그 결과의 객체를 '<-' 연산자를 통해 객체 x에 할당한 것입니다. '<-': 할당연산자 위의 실행은
assign()
함수에 의해 실행될 수 있습니다.
> assign("y", c(10.4, 5.6, 3.1, 6.4, 21.7)) > y [1] 10.4 5.6 3.1 6.4 21.7할당연산자의 방향을 반대로 할 수 있습니다.
> c(10.4, 5.6, 3.1, 6.4, 21.7)->z; z [1] 10.4 5.6 3.1 6.4 21.7당연히 위 표현(expression)에 의해 생성되는 객체는 다음과 같이 다른 계산에 적용되거나 새로운 객체로 할당될 수 있습니다.
> 1/z [1] 0.09615385 0.17857143 0.32258065 0.15625000 0.04608295 > zz<-c(z, 0, z); zz [1] 10.4 5.6 3.1 6.4 21.7 0.0 10.4 5.6 3.1 6.4 21.7
벡터와 연산
vector의 산술은 요소별로 일어나며 계산의 대상이 모두 같은 길이를 가질 필요는 없습니다. 즉, 짧은 벡터는 대응되는 긴 벡터에 대해 재사용(recycle)됩니다. 재사용은 대응되는 두 벡터의 길이가 배수관계일 경우 실행됩니다.> 1/z [1] 0.09615385 0.17857143 0.32258065 0.15625000 0.04608295 > zz<-c(z, 0, z); zz [1] 10.4 5.6 3.1 6.4 21.7 0.0 10.4 5.6 3.1 6.4 21.7벡터의 길이는
lenght()
함수에 의해 확인할 수 있습니다.
> length(x);length(y) [1] 3 [1] 6사칙연산외에 거듭제곱 연산자 '^', log(), exp(), sin(), cos(), tan(), sqr() 등등의 연산을 수행할 수 있습니다. 벡터의 최대와 최소는
min(), max()
로 반환하며 이는 그 벡터의 범위를 나타내는 것으로 range()
함수를 사용하여 c(min(), max())를 나타낼 수 있습니다.
벡터의 합은 sum()
, 곱은 prod()
함수를 적용합니다.
벡터의 평균은 mean()
으로 sum()/length()와 같으며 분산은 var()로서 다음과 같습니다.
$$\frac{\text{sum(x-mean(x))}^2}{\text{length(x)-1}}$$
var()함수의 인수가 n × p 행렬이면 p × p 공분산행렬을 반환합니다. (n: 샘플수, p: 독립변수의 수)
벡터를 오름차순으로 정렬하기 위해 sort()
함수를 적용합니다. 또한 정렬된 결과의 인덱스를 반환하기 위해 order(), sort.list()를 적용합니다.
> set.seed(1) > x<-sample(1:100, 10);x [1] 68 39 1 34 87 43 14 82 59 51 > sort(x) [1] 1 14 34 39 43 51 59 68 82 87 > order(x) [1] 3 7 4 2 6 10 9 1 8 5 > sort.list(x) [1] 3 7 4 2 6 10 9 1 8 5
logical vector의 요소 : TRUE(1), FALSE(0), NA(not available)
논리 연산자: >, >=, <, <=, ==, &(and), |(or), !(not)
벡터의 요소값이 미지일 경우 또는 결측치일 경우 NA(not available)를 할당하여 벡터내의 위치를 예약할 수 있습니다. 일반적으로 NA에 대한 모든 작업은 NA가 됩니다.
함수 is.na(x)
는 x의 해당 요소가 NA인 경우에만 값이 TRUE인 x와 동일한 크기의 논리 벡터를 제공합니다.
> z<-c(1:5, NA); z [1] 1 2 3 4 5 NA > is.na(z) [1] FALSE FALSE FALSE FALSE FALSE TRUENaN(Not a Number)은 계산과정에서 발생합니다.
> 0/0 [1] NaN > Inf-Inf [1] NaNNaN 역시 is.na()에서 TRUE로 반환 , is.nan() 함수에서는 NaN만 TRUE로 반환
> z>-c(1:3, NA, NaN); z [1] 1 2 3 NA NaN > is.na(z) [1] FALSE FALSE FALSE TRUE TRUE
문자 벡터가 따옴표 없이 인쇄될 때 <NA>로 인쇄되는 경우가 있습니다.
문자는 단일 또는 이중 따옴표로 작성합니다.
paste()
함수는 숫자와 문자(열)을 연결합니다.
> lab<-paste(c("x","y"), 1:10, sep=""); lab [1] "x1" "y2" "x3" "y4" "x5" "y6" "x7" "y8" "x9" "y10"위 결과와 같이 문자벡터의 길이는 숫자길이에 배수가 되므로 재사용됩니다.
인덱스 벡터에 의한 요소의 호출
1. 논리연산자에 의한 인덱스 벡터를 사용하여 호출> x<-c(sample(-10:10, 5), NA); x [1] 4 5 -1 -4 3 NA > y<-x[!is.na(x)]; y [1] 4 5 -1 -4 3 > (x+1)[(!is.na(x))& x>0]->z; z [1] 5 6 42. 양의 정수로 인덱스 사용
c('apple', 'pear')[rep(c(1,2,2,1), times=4)] [1] "apple" "pear" "pear" "apple" "apple" "pear" "pear" "apple" "apple" [10] "pear" "pear" "apple" "apple" "pear" "pear" "apple"3. 음의 정수를 사용하여 요소배제
> x<-c(sample(-10:10, 5), NA); x [1] 3 10 0 -3 -2 NA > x[-6] [1] 3 10 0 -3 -24. 벡터는 names()함수를 사용하여 각 요소에 이름을 할당할 수 있습니다. 그 이름을 인덱스로 사용합니다.
> fruit<-c(5, 10, 1, 20) > names(fruit)<-c('orange', 'banana', 'apple', 'peach') > fruit orange banana apple peach 5 10 1 20 > lunch<-fruit[c('orange', 'peach')]; lunch orange peach 5 20인덱스를 사용하여 객체의 요소를 호출할 수 있으며 다음과 같이 수정할 수 있습니다.
> x<-c(sample(-10:10, 5), NA); x [1] -2 -3 4 -9 -1 NA > x[is.na(x)]<-0; x [1] -2 -3 4 -9 -1 0 > x[x<0]<-abs(x[x<0]); x [1] 2 3 4 9 1 0
- rep(객체, each or times=n, length.out)
- 객체를 n번 반복 (each=n 이면 객체의 각 요소를 n 번 반복, times=n은 객체 자체를 반복, times는 기본인수), length.out은 생성된 객체의 전체 길이를 제어
객체
기술적으로 R은 객체에서 작동합니다. 예로는 숫자(실수) 또는 복소수 값의 벡터, 논리 값의 벡터 및 문자열의 벡터들은 특정한 저장소에 저장됩니다. 이를 객체(object)라고합니다. 구성 요소가 모두 동일한 유형 또는 모드(mode, 숫자10, 복합, 논리, 문자 및 원시)이기 때문에 이러한 구조를 "원자" 구조라고 합니다.벡터는 모두 동일한 모드의 값을 가져야 합니다. 따라서 주어진 벡터는 논리적, 숫자, 복소수, 문자 또는 원시(raw) 중 하나여야 합니다. (이 규칙에 대한 유일한 명백한 예외는 사용할 수 없는 수량에 대해 NA로 나열된 특별한 "값"이지만 실제로는 여러 유형의 NA가 있습니다.) 벡터는 비어 있을 수 있습니다. 예를 들어 빈 문자열 벡터는 문자(0)로 나열되고 빈 숫자 벡터는 숫자(0)로 나열됩니다.
R은 또한 list 모드의 객체에 대해 작동합니다. 이들은 그 객체 내부에 포함된 원소들의 모드가 다양할 수 있습니다. 즉, R의 모든 모드를 가질 수 있는 객체이며 각 원소들을 순서를 가지는 시퀀스 객체입니다. list는 다른 list 자체를 원소로 가질 수 있기 때문에 원자 구조가 아닌 "재귀적"이라고 알려져 있습니다.
> c(1, 2, c(3, 4, 5)) [1] 1 2 3 4 5 > list(1, 2, list('a', 'b', 'c')) [[1]] [1] 1 [[2]] [1] 2 [[3]] [[3]][[1]] [1] "a" [[3]][[2]] [1] "b" [[3]][[3]] [1] "c"다른 재귀 구조는 모드 함수와 표현식의 구조입니다. 함수는 유사한 사용자 작성 함수와 함께 R 시스템의 일부를 형성하는 객체이며 나중에 자세히 설명합니다. 객체로서의 표현식은 R에서 모델링과 함께 사용되는 공식에 대해 논의할 때를 제외하고는 이 가이드에서 논의하지 않을 R의 고급 부분을 형성합니다.
객체의 모드란 그 기본 구성 요소의 기본 유형을 의미합니다. 이것은 객체의 "속성"(attribute)의 특별한 경우입니다. 모든 물체의 또 다른 속성은 길이입니다. 객체의 정의된 구조의 모드와 길이를 찾는 데
mode(object)
및 length(object)
함수를 사용할 수 있습니다. 객체의 추가 속성은 일반적으로 attributes(객체)
에 의해 제공됩니다. 이 때문에 모드와 길이는 객체의 "본질 속성"(intrinsic attributes)이라고도 합니다. 얘를들어 다음 객체 z은 10개의 원소를 가지면 수치형입니다. 다른 부가적인 속성은 가지고 있지 않습니다.
> z<-1:10; length(z) [1] 10 > z [1] 1 2 3 4 5 6 7 8 9 10 > mode(z) [1] "numeric" > attributes(z) NULL객체의 길이는 length() 함수를 사용하여 크기를 자를 수 있습니다.
> length(z)<-3 > z [1] 1 2 3
as.modename(객체)
함수를 사용하여 각 객체의 모드는 변경할 수 있습니다. 그러나 일부는 이러한 변경을 허가하지 않습니다.
> z1<-as.character(z); z1 [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" > as.integer(z1) [1] 1 2 3 4 5 6 7 8 9 10위에서 언급한 것과 같이 빈객체는 0으로 표현됩니다. 그 자체로 길이가 지정되지 않았으므로 다음 코드와 같이 임의의 위치에 새로운 값을 입력할 수 있습니다. 이 경우 다른 위치의 값은 지정되지 않으므로 NA가 됩니다.
> e<-numeric() > mode(e) [1] "numeric" > e numeric(0) > e[3]<-17; e [1] NA NA 17객체를 생성하는 다른 방법으로
scan('')
함수를 사용할 수 있습니다. 이 함수를 실행하면 다음 코드와 같이 사용자가 값을 입력할 수 있도록 합니다. 입력 대상이 문자이면 what 인자를 추가합니다.
> x<-scan('') 1: 2 2: 6 3: 1 4: Read 3 items > x [1] 2 6 1 > y<-scan(what='') 1: 스캔 2: 객체 3: 만들기 4: Read 3 items > y [1] "스캔" "객체" "만들기"attributes(객체) 함수는 해당 객체에 대해 현재 정의된 모든 비본질 속성의 목록을 반환합니다.
attr(object, name)
함수를 사용하여 특정 속성을 선택할 수 있습니다. 이 함수에서 name은 문자형모드이어야 합니다. 즉, 따옴표와 함께 표시되어야 합니다. 다음은 matrix()함수를 사용하여 생성한 $3 \times 3$ 차원의 행렬입니다. 이 객체에 대한 attributes(), attr()함수를 적용합니다.
> a<-matrix(1:9, ncol=3); a [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > attributes(a) $dim [1] 3 3 > attr(a, 'dim') [1] 3 3역으로 attr()함수를 사용하여 객체의 모드를 변경할 수 있습니다. 다음은 벡터 객체인 x를 행렬 객체로 변경한 것입니다.
> x<-1:9;x [1] 1 2 3 4 5 6 7 8 9 > attr(x, 'dim')<-c(3,3) > x [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9R의 모든 객체에는
class()
함수에 의해 보고되는 클래스(class)가 있습니다. 클래스는 객체에 특정한 상태와 동작을 부여하기 위해 R내에서 영역을 지정합니다. R의 모든 객체는 기본적으로 벡터입니다. 단순 벡터인 "numeric", "logical", "character" 또는 "list"는 객체의 모드가 클래스입니다.
> x; class(x) [1] 1 2 3 [1] "numeric" > y; class(y) [1] "string" [1] "character" > z; class(z) [1] FALSE [1] "logical" > ls; class(ls) [[1]] [1] "apple" [[2]] [1] "bear" [1] "list"그러나 여러벡터들의 연결로 생성되는 "matrix", "array", "factor" 및 "data.frame"은 각 객체가 포함되는 모든 클래스들을 반환합니다. 다음은 행렬객체로 array 클래스에 속함을 알 수 있습니다.
> mat<-matrix(1:4, nrow=2); mat [,1] [,2] [1,] 1 3 [2,] 2 4 > class(mat) [1] "matrix" "array"클래스의 효과를 일시적으로 제거하려면 unclass() 함수를 사용하십시오. 다음은 factor 모드의 객체입니다. 이 모드는 데이터와 수준(level)으로구성됩니다.
> x<-sample(1:5, 10); x sample.int(length(x), size, replace, prob)에서 다음과 같은 에러가 발생했습니다: 'replace = FALSE' 일때는 모집단보다 큰 샘플을 가질 수 없습니다 > x<-sample(1:5, 10, replace=TRUE); x [1] 1 3 1 5 1 5 1 5 4 2 > x1<-factor(x, level=1:5); x1 [1] 1 3 1 5 1 5 1 5 4 2 Levels: 1 2 3 4 5 > attributes(x1) $levels [1] "1" "2" "3" "4" "5" $class [1] "factor"이 객체의 자료형은 수치형이지만 levels은 문자로 인식됩니다. 그러므로 위 객체에 대한 평균 계산은 에러를 발생합니다. 이러한 경우
unclass()
함수를 사용하여 객체의 class를 단순 벡터로 변환하여 계산할 수 있습니다.
> mode(x1) [1] "numeric" > mode(levels(x1)) [1] "character" > mean(x1) [1] NA 경고메시지(들): mean.default(x1)에서: 인자가 수치형 또는 논리형이 아니므로 NA를 반환합니다 > x2<-unclass(x1); x2 [1] 1 3 1 5 1 5 1 5 4 2 attr(,"levels") [1] "1" "2" "3" "4" "5" > mean(x2) [1] 2.8 > class(x2) [1] "integer"
댓글
댓글 쓰기