내용
데이터 관리를 위한 함수들과 제어문
함수들
수학함수
함수 | 설명 |
---|---|
abs(x) | 절대값반환 abs(-4) → 4. |
sqrt(x) | 제곱근, sqrt(25) → 5 &eqiv; 25^(0.5). |
ceiling(x) | x보다 작지않은 가장 작은 정수 ceiling(3.21) → 4 |
floor(x) | x보다 크지않은 가장 큰 정수 floor(3.21) → 3 |
trunc(x) | x의 값 중 숫점 이하의 값을 버림으로서 형성된 정수 trunc(3.21) → 3 |
round(x, digits=n) | x의 지정한 자릿수+1 에서 반올림 round(3.475, digits=2) → 3.48. |
signif(x, digits=n ) | x를 지정된 유효 자릿수로 반올림 signif(3.475, digits=2) → 3.5. |
cos(x) , sin(x) , tan(x) | Cosine, sine, and tangent cos(2) → -0.416. |
acos(x) , asin(x) , atan(x) | 삼각함수의 역함수, arc-cosine, arc-sine, and arc-tangent acos(-0.416) → 2. |
cosh(x) , sinh(x) , tanh(x) | 쌍곡선 함수인 hyperbolic cosine, sine, and tangent sinh(2) → 3.627. |
acosh(x) , asinh(x) , atanh(x) | Hyperbolic arc-cosine, arc-sine, and arc-tangent asinh(3.627) → 2. |
log(x, base=n) | 밑수가 a인 로그함수 log(10, 2) = log(10)/log(2) \→ 3.321928 |
log(x) | 자연로그함수 log(10) → 2.3026. |
log10(x) | 상용로그함수 log10(10) → 1. |
exp(x) | 지수함수=$e^x$ exp(2.3026) → 10.00015 |
위의 함수들은 원자형(atomic type)에 작동되므로 벡터, 행렬, 배열에 적용됩니다.
exp(c(1,2,4))
[1] 2.718282 7.389056 54.598150
x<-matrix(1:4, ncol=2);x
[,1] [,2] [1,] 1 3 [2,] 2 4
log(x)
[,1] [,2] [1,] 0.0000000 1.098612 [2,] 0.6931472 1.386294
통계함수
일반적으로 대부분의 통계함수는 매개변수를 포함합니다. 예를 들어 다음은 평균을 계산하는 함수입니다.- mean(x):
- 객체 x이 산술평균을 반환
- mean(x, trim=0.05, na.rm=TRUE)
- 객체 x의 상위와 하위 각각 5%에 해당하는 값들을 삭제하고 평균을 계산하는 trim mean을 반환, na.rm은 결측치 제거를 선택하는 매개변수.
함수 | 설명 |
---|---|
mean(x) | 평균 mean(c(1,2,3,4)) →2.5. |
median(x) | 중간값 median(c(1,2,3,4)) →2.5. |
sd(x) | 표준편차 sd(c(1,2,3,4)) →1.29. |
var(x) | 분산 var(c(1,2,3,4)) →1.67. |
mad(x) | Median absolute deviation mad(c(1,2,3,4)) →1.48. |
quantile(x, probs) | 객체 x를 백분위수로 정렬할 경우 지정된 위치(probs)의 값(들)을 반환, probs의 범위 [0, 1] 30, 84번째의 값들, y <- quantile(x, c(.3,.84)) |
range(x) | 객체의 범위 range(c(1,2,3,4)) → c(1,4). |
sum(x) | 합 sum(c(1,2,3,4)) → 10. |
diff(x, lag=n) | 지정된 간격(n)의 값들의 차이를 계산, lag의 기본값은 1 x<- c(1, 5, 23, 29); diff(x) → c(4, 18, 6). : 5-1, 23-5,... diff(x, 2) → 22 24: 23-1, 29-5 |
min(x) | 최소값 min(c(1,2,3,4)) → 1. |
max(x) | 최대값 max(c(1,2,3,4)) → 4. |
scale(x, center=TRUE, scale=TRUE) | 객체를 표준화합니다. center = mean, scale=sd 표준화의 예 참조 |
표준화는 데이터들을 평균 0, 표준편차가 1이 되도록 이동시킨 것으로 그 결과를 z-score라고 합니다. $$\text{z-score}=\frac{x-\mu}{\sigma}$$ scale() 함수를 사용하여 표준화합니다. 이 함수는 수치형인 벡터, 배열, 데이터 프레임 등에서 작동됩니다.
x<-sample(1:100, 15); x
[1] 95 84 55 90 91 53 49 60 42 1 14 73 43 31 89
scale(x, center=FALSE, scale=TRUE)
[,1] [1,] 1.42390452 [2,] 1.25903137 ⋮ [14,] -0.92773098 [15,] 1.06517261 attr(,"scaled:center") #=mean [1] 58 attr(,"scaled:scale") #=sd [1] 29.10326
mean(x)
[1] 58
sd(x)
[1] 29.10326위 표준화된 결과는 평균이 0, 표준편차가 1입니다. 이 데이터를 평균이 10, 표준편차가 1.2인 세로운 데이터 셋을 생성한다고 가정하면 표준화 식을 역으로 적용하면 됩니다. $$x=\text{z-score}*\sigma+\mu$$ 위 객체 x가 data.frame 형식일 경우 위 식에 의해 계산된 값들을 새로운 열에 첨가할 수 있습니다. 이 작업은
transform()
함수를 사용할 수 있습니다.
x<-data.frame(data=sample(1:100, 15)); head(x)
data 1 34 2 86 3 20 4 6 5 63 6 16
new<-scale(x)*1.2+10;head(new)
data [1,] 9.469190 [2,] 8.827081 [3,] 11.438324 [4,] 7.928129 [5,] 9.982877 [6,] 10.881829
x<-transform(x, new=new);head(x)
data data.1 1 34 9.469190 2 86 8.827081 3 20 11.438324 4 6 7.928129 5 63 9.982877 6 16 10.881829
확률함수
R에서 확률함수는 다음 형태를 취합니다.
[ dpqr] distributtion 의 약어()
다음은 R에서 제공하는 확률분포이름과 그 약어입니다.
- d=확률 분포 함수(Probability distribution function)
- p=누적확률분포함수(Cumulative probability distribution function)
- q=백분위수 함수(quantile function)
- r=랜덤 발생(random generation, random deviates)
함수 | 약어 | 함수 | 약어 |
---|---|---|---|
Beta | beta | Logistic | logis |
Binomial | binom | Multinomial | multinom |
Cauchy | cauchy | Negative binomial | nbinom |
Chi-squared (noncentral) | chisq | Normal | norm |
Exponential | exp | Poisson | pois |
F | f | Wilcoxon Signed Rank | signrank |
Gamma | gamma | T | t |
Geometric | geom | Uniform | unif |
Hypergeometric | hyper | Weibull | weibull |
Lognormal | lnorm | Wilcoxon Rank Sum | wilcox |
예
평균과 표준 편차를 지정하지 않으면 표준 정규 분포가 가정됩니다(평균=0, sd=1). 밀도(dnorm), 분포(pnorm), 분위수(qnorm) 및 무작위 편차 생성(rnorm) 함수의 결과는 다음과 같습니다.
x<-pretty(c(-3, 3), 30) y<-dnorm(x) plot(x, y, type="l", xlab="Normal Deviate", ylab="Density", yaxs='i')z-score 1.96까지의 표준정규분포의 면적을 계산하기 위해 접두어 'p'를 적용합니다.
pnorm(1.96)
[1] 0.9750021평균이 500이고 표준 편차가 100인 정규 분포의 90번째 백분위수 값은 얼마입니까?
qnorm(0.9, mean=500, sd=100)
[1] 628.1552평균이 50이고 표준 편차가 10인 임의의 정규 편차 50개를 생성합니다.
rnorm(50, mean=50, sd=10)
[1] 50.76424 40.82784 43.02894 59.34081 52.01408 64.51677 44.30565 42.01822 … [49] 50.35609 35.42057위의 난수(랜덤수)생성은 코드 실행시마다 다른 수가 반환됩니다. 결과의 재현을 이루기 위해
set.seed()
함수를 사용합니다.
다음은 균일분포를 따르는 랜덤수 5개를 생성합니다.
runif(5)
[1] 0.3926972 0.8138806 0.3762485 0.3808122 0.2649184
set.seed(12)
runif(5)
[1] 0.06936092 0.81777520 0.94262173 0.26938188 0.16934812
set.seed(12)
runif(5)
[1] 0.06936092 0.81777520 0.94262173 0.26938188 0.16934812위와 같이 set.seed() 함수에 의해 생성된 난수를 고유객체로 등록하는 효과를 가집니다. 즉, 난수의 재현을 보장할 수 있습니다. 시뮬레이션 연구와 몬테카를로 연구에서는 종종 주어진 평균 벡터와 공분산 행렬을 사용하여 다변량 정규 분포에서 데이터를 추출하려고 합니다. MASS 패키지의
mvrnorm()
함수는 이것을 쉽게 해줍니다. 함수 호출은
- mvrnorm(n, mean, sigma)
- n: 난수의 크기, mean: 평균 벡터, sigma: 분산-공분산 행렬 또는 상관관계 행렬
library(MASS) options(digits=3) set.seed(1) mu<- c(230.7, 146.7, 3.6) std<- matrix(c(15360.8, 6721.2, -47.1, 6721.2, 4700.9, -16.5, -47.1, -16.5, 0.3), nrow=3, ncol=3) da1 <- mvrnorm(500, mu, std) da1 <- as.data.frame(da1) names(da1) <- c("y","x1","x2") dim(da1)
[1] 500 3
head(da1)
y x1 x2 1 155 106.9 4.25 2 248 167.8 4.00 3 108 137.7 3.75 4 427 241.0 3.10 5 288 132.2 3.36 6 156 43.3 3.03
sapply(da1, mean)
y x1 x2 232.7 149.6 3.6
cov(da1)
y x1 x2 y 15575.5 6971.6 -49.278 x1 6971.6 5104.0 -16.164 x2 -49.3 -16.2 0.321위의 샘플들에 대한 평균과 공분산행렬의 결과는 원시데이터의 값과 차이를 발생합니다. 다음은 smpling 수를 10000으로 증가시킨 결과로 원시데이터에 근접함을 나타냅니다.
set.seed(2) da2 <- mvrnorm(10000, mu, std) da2<-as.data.frame(da2) sapply(da2, mean)
V1 V2 V3 232.0 147.4 3.6
cov(da2)
V1 V2 V3 V1 15414.7 6657.4 -47.444 V2 6657.4 4670.4 -16.389 V3 -47.4 -16.4 0.302
문자함수
수학 및 통계 함수는 숫자 데이터에서 작동하지만 문자 함수는 텍스트 데이터에서 정보를 추출하거나 인쇄 및 보고를 위해 텍스트 데이터의 형식을 다시 지정합니다. 다음은 문자에 사용되는 주요함수 입니다.함수 | 설명 |
---|---|
nchar(x) | 객체 x의 문자의 수를 반환 nchar('string') → 6 |
substr(x, start, stop ) | 문자 벡터의 부분을 추출 또는 대체 합니다.
x <- "abcdef" substr(x, 2, 4) [1] "bcd" substr(x, 2, 4)<-"2222" x [1] "a222ef" |
grep(pattern, x, ignore.case=FALSE, fixed=FALSE) |
x에서 패턴을 검색합니다. fixed=FALSE이면 pattern은 정규식입니다. fixed=TRUE이면 pattern은 텍스트 문자열입니다. 일치하는 인덱스를 반환합니다. grep("A", c("b","A","c"), fixed=TRUE) → 2 |
sub(pattern, replacement, x, ignore.case=FALSE, fixed=FALSE) | x의 패턴을 결정하고 지정된 문구(replacement)로 대체합니다. fixed=FALSE이면 정규식, TRUE이면 패턴은 문자열입니다.sub("\\s",".", "hello there") [1] "hello.there""\s"는 빈칸(whitespace)를 나타내는 정규식이며 R에서 "\"는 escape 문자이므로 "\\s"으로 나타냄 |
strsplit(x, split, fixed=FALSE) | 문자형 벡터 x의 요소를 기준(split)에 따라 분할합니다. fixed=FALSE 이면 기준이 정규식이며 TRUE이면 문자(열)입니다. 결과는 list입니다.
y <- strsplit("abc", "") class(y) [1] "list" y [[1]] [1] "a" "b" "c" unlist(y) [1] "a" "b" "c" unlist(y)[2] [1] "b" sapply(y,'[', 2) [1] "b" |
paste(..., sep="") | sep 문자열을 사용하여 문자열을 분리한 후 문자열을 연결합니다.paste("x", 1:3, sep="_") [1] "x_1" "x_2" "x_3" paste("오늘 날짜:", date()) [1] "오늘 날짜: Sun Oct 9 13:22:17 2022" |
toupper(x) | 알파벳 대문자로 전환 toupper("abc") → “ABC”. |
tolower(x) | 알파벳 소문자로 전환 tolower("ABC") → “abc” |
grep(), sub(), strsplit()
함수는 텍스트 문자열(fixed=TRUE) 또는 정규식(fixed=FALSE)(기본값은 FALSE)을 검색할 수 있습니다.(정규식 참조)
유용한 함수들
R의 대부분의 객체에 적용되는 유용한 함수들입니다.함수 | 설명 |
---|---|
length(x) | 객체 x의 길이 Lx <- c(2, 5, 6, 9) length(x) [1] 4 |
seq(from, to, by) | 수열생성seq(1,10,2) [1] 1 3 5 7 9 |
rep(x, n) | x를 n번 반복 > rep(1:3, 2) [1] 1 2 3 1 2 3 rep(1:3, each=2) [1] 1 1 2 2 3 3 |
cut(x, n) | 연속변수를 범주화하는 것으로 x를 n 수준의 인수로 나눕니다. 순서가 지정된 요소를 생성하려면ordered_result = TRUE 옵션을 포함합니다.
x<-rnorm(100) y<-cut(x, 10) #10구간으로 그룹화 y[1:4] [1] (1.67,2.16] (-1.18,-0.708] (-2.14,-1.66] (-1.66,-1.18] y2<-cut(x, -3:3, ordered_result=TRUE) #n을 벡터로 제시하므로서 소구간을 설정 levels(y2) [1] "(-3,-2]" "(-2,-1]" "(-1,0]" "(0,1]" "(1,2]" "(2,3]" table(y2) #각 구간의 빈도수를 반환 y2 (-3,-2] (-2,-1] (-1,0] (0,1] (1,2] (2,3] 2 13 33 37 12 3 |
pretty(x, n) | 중단점을 만듭니다. 동일한 간격의 반올림 값 n+1을 선택하여 연속 변수 x를 n 간격으로 나눕니다. 플로팅에 자주 사용됩니다. |
cat(… , file ="myfile", append =FALSE) | 객체를 연결합니다.firstname <- c("Jane") cat("Hello" , firstname, "\n") Hello Jane |
댓글
댓글 쓰기