데이터분석/R

R언어 공부 - 4

환성 2022. 12. 27. 16:50
728x90

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