1) 재활용 규칙
서로 길이가 다른 벡터끼리 연산할 때 적용되는 규칙
양쪽 벡터의 첫 번째 원소들에서부터 쌍으로 처리한 후 어떤 시점이 되면 긴 벡터 쪽에는 처리되지 않은 원소가 남아 있고
짧은 벡터에는 원소가 모자르게 된다.이때 재활용 규칙이 적용되어 짧은 벡터의 처음으로 돌아가서 다시 원소들을 재활용한다.
# 예시
> 1:6
[1] 1 2 3 4 5 6
> 1:3
[1] 1 2 3
> (1:6) + (1:3)
[1] 2 4 6 5 7 9
# 행 뿐만 아니라 열 벡터에 적용된다
> cbind(1:6)
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
[5,] 5
[6,] 6
> cbind(1:3)
[,1]
[1,] 1
[2,] 2
[3,] 3
> cbind(1:6, 1:3)
[,1] [,2]
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 1
[5,] 5 2
[6,] 6 3
2) 요인 생성하기
factor 함수는 이산 값 벡터를 요인으로 표현하게 해준다.
f <- factor(v) # v는 문자열 또는 정수 벡터
# 입력한 벡터가 일부만이 부분집합으로 포함되어 있다면 두 번째 인자를 넣어 해당 요인에서 발생하는 것들을 모두 표현
f <- factor(v, levels)
# 만약 벡터에 가능한 모든 수준 중 일부만 들어 있을경우, R은 가능한 수준들 전체를 알 길이 없다
# 다음은 데이터가 관찰될 요일을 말해 주는 wday라는 문자열 값과 변수이다.
> wday <- c("Wed", "Thu", "Mon", "Wed", "Thu", "Thu", "Thu", "Tue", "Tue", "Thu", "Tue")
> f <- factor(wday)
> f
[1] Wed Thu Mon Wed Thu Thu Thu Tue Tue Thu Tue
Levels: Mon Thu Tue Wed
# 하지만 금요일이 나열되지 않았다. R은 금요일이 가능한 값이라는 것을 모르고 있기 때문에
# wday의 가능한 수준들을 모두 명확하게 열거할 필요가 있다.
> f <- factor(wday, levels=c("Mon", "Tue", "Wed", "Thu", "Fri"))
> f
[1] Wed Thu Mon Wed Thu Thu Thu Tue Tue Thu Tue
Levels: Mon Tue Wed Thu Fri
3) 여러 벡터를 합쳐 하나의 벡터와 요인으로 만들기
stack 함수를 사용해 목록을 두 열짜리 데이터 프레임으로 결합한다.
comb <- stack(list(v1= v1, v2=v2, v3=v3)) # 3개의 벡터를 합침
이 데이터 프레임의 열은 values와 ind라 불린다. 첫번째 열은 데이터, 두 번째 열은 상응 요인을 담게 된다.
# 대학 신입생, 2학년, 3학년에 대해 설문조사를 할 때 3개의 벡터가 생성된다
# 그 집단 간 차이에 대해 분산분석(ANOVA)를 수행할 때 필요하다
# 이떄 ANOVA 함수 aov는 설문 결과가 담긴 하나의 벡터와 집단을 구별해 주는 상응 요인을 필요로 하게 된다
# 신입생 : freshmen 2학년 : sophomore 3학년 : juniors
> freshmen <- c(1,2,1,1,5)
> sophomores <- c(3,2,3,3,5)
> juniors <- c(5,3,4,3,3)
> comb <- stack(list(fresh = freshmen, soph = sophomores, jrs = juniors))
> comb
values ind
1 1 fresh
2 2 fresh
3 1 fresh
4 1 fresh
5 5 fresh
6 3 soph
7 2 soph
8 3 soph
9 3 soph
10 5 soph
11 5 jrs
12 3 jrs
13 4 jrs
14 3 jrs
15 3 jrs
# 분산 분석 결과
> aov(values ~ ind, data = comb)
Call:
aov(formula = values ~ ind, data = comb)
Terms:
ind Residuals
Sum of Squares 6.933333 20.000000
Deg. of Freedom 2 12
Residual standard error: 1.290994
Estimated effects may be unbalanced
4) 리스트의 원소
lst[[n]]
- 원소이며, lst의 n번째 원소를 뜻함
lst[n]
- 리스트이며, lst의 n번째 원소에서 가져온 원소 하나를 포함하고 있음
5) 이름 / 값 연계 리스트 만들기
list 함수는 원소에 이름을 부여할 수 있게 해주면서, 각 이름과 값 사이에 연계를 만든다.
values <- c(1,2,3)
names <- c("A", "B", "C")
lst <- list()
lst[names] <- values
# 예시
> lst <- list()
> lst$far.left <- 0.1
> lst$left <- 0.15
> lst$mid <- 0.5
> lst$right <- 0.7
> lst$far.right <- 0.9
> values <- pnorm(-2:2)
> names <- c("far.left", "left", "mid", "right", "far.right")
> lst[names] <- values
> lst
$far.left
[1] -2
$left
[1] -1
$mid
[1] 0
$right
[1] 1
$far.right
[1] 2
6) 리스트 구조를 없애 벡터로 만들기
기본적인 통계 함수를 사용하기 위해 리스트를 없애고 벡터로 만든 뒤 계산해야 한다.
아니면 출력하기 전 리스트의 구조를 없애서 벡터로 만드는 법도 있다.
> iq.scores <- list(100, 105, 150, 140, 130)
> mean(iq.scores)
[1] NA
Warning message:
In mean.default(iq.scores) :
인자가 수치형 또는 논리형이 아니므로 NA를 반환합니다
> mean(unlist(iq.scores))
[1] 125
7) 조건을 사용해 리스트의 원소 제거하기
조건이 달성되었을 때 TRUE 반환, 그렇지 않을 때 FALSE 반환 후 purrr 패키지의 discard 함수를 사용해 조건을 만족하는 값들을 제거한다.
> lst <- list(NA, 0, NA, 1, 2)
> lst %>%
+ discard(is.na)
[[1]]
[1] 0
[[2]]
[1] 1
[[3]]
[1] 2
discard 함수는 TRUE FALSE를 반환하는 함수를 사용해서 원소를 리스트로부터 제거한다. 혹은 직접 서술부를 정의한 후 discard와 함께 사용해도 된다.
> is_na_or_null <- function(x){
+ is.na(x) | is.null(x)
+ }
> lst <- list(1, NA, 2, NULL, 3)
> lst %>%
+ discard(is_na_or_null)
#> [[1]]
#> [1] 1
#>
#> [[2]]
#> [1] 2
#>
#> [[3]]
#> [1] 3
8) 행렬의 연산 수행하기
t(A) : A의 전치 행렬
solve(A) : A의 역행렬
A %*% B : A와 B의 행렬 곱셈
diag(n) : n x n 대각 행렬 생성
9) 행렬에서 하나의 행 또는 열을 선택하기
drop=FALSE 인자를 넣어주면 R은 차원을 유지한다. 이런 경우 행을 선택한다면 행 벡터(1 x n 행렬)를 반환한다.
mat[1, drop=FALSE] # 행 하나짜리 행렬의 첫 행
mat[, 3,drop=FALSE] # 열 하나짜리 행렬의 셋째 열
mat[1, , drop=FALSE]
#> [,1] [,2] [,3]
#> [1,] 1.1 1.2 1.3
10) 행 데이터나 열 데이터로 데이터 프레임 만들기
열 데이터로 데이터 프레임 만들기
- 데이터가 여러 개의 벡터와 요인에 담겨 있으면 data.frame 함수를 사용해서 데이터 프레임으로 조립한다
- 데이터가 벡터와 요인을 포을 포함하고 있는 리스트에 담겨 있다면 as.data.frame을 사용한다
df <- data.frame(v1, v2, v3, f1)
df <- as.data.frame(list.of.vectors)
행 데이터로 데이터 프레임 만들기
- rbind를 사용해서 행들을 하나의 큰 데이터 프레임으로 묶는다
rbind(행1, 행2, 행3...행n)
# 예시
> r1 <- dafa.frame(a = 1, b = 2, c = "X")
> r2 <- data.frame(a = 3, b = 4, c = "Y")
> r3 <- data.frame(a = 5, b = 6, c = "Z")
> rbind(r1, r2, r3)
a b c
1 1 2 X
2 3 4 Y
3 5 6 Z
# 행들로 이루어진 리스트일 떄 bind_rows 함수를 사용하면 된다
> list.of.rows <- list(r1, r2, r3)
> bind_rows(list.of.rows)
a b c
1 1 2 X
2 3 4 Y
3 5 6 Z
11) 위치를 통해 데이터 프레임의 열 선택하기
select 함수를 사용한다
df %>% select(n1, n2, n3....nk)
'데이터분석 > R' 카테고리의 다른 글
R언어 공부 - 6 (0) | 2022.12.30 |
---|---|
R언어 공부 - 5 (3) | 2022.12.29 |
R언어 공부 - 3 (0) | 2022.12.27 |
R언어 공부 - 2 (0) | 2022.12.26 |
R언어 공부 - 1 (0) | 2022.12.26 |