Chapter 3 R basics

3.1 vector matirx list

3.1.1 오브젝트 (objects)

값(value)을 변수(variable)에 대입시키는 방법이다. 이를 이용해서 변수를 통한 연산이 가능하다.

a <-1
b <-2
c <- -1

a*b+c
## [1] 1

값에는 숫자 외에도 여러 종류가 가능하다. 대표적인 것이 숫자(numeric), 문자(character), 논리값(logical) 값을 대입시킬 수 있다.

student_a_age  <- 43
student_a_name <- '윤진하'
student_a_pass <- FALSE

즉, 한변수에 하나의 값을 제공하는 0차원적 개념이다.

3.1.2 백터 (Vectors), 팩터 (factors)

백터는 한 변수에 여러개의 값이 존재하는 경우다. 이때 c() 를 사용하고 cconcatenate의 C이다. 결측값 (missing value) 는 NANAN으로 표시된다. 백터에는 순서가 존재하므로, my_vector[i] 를 이용하여 i번째 값을 추출할 수있다.

student_all_age <- c(24, 31, 40, 16)
student_all_age
## [1] 24 31 40 16

각각 아래의 명령에 따라 어떤 값이 나타날지 예상해보자.

student_all_age[1]
## [1] 24
student_all_age[1:2]
## [1] 24 31
student_all_age[c(1, 3)]
## [1] 24 40
student_all_age[-4]
## [1] 24 31 40

숫자로된 백터는 기본 함수를 사용하여 요약값을 나타낼 수 있다. max(), min(), range(), length(), sum(), mean(), prod(), sd(), var(), sort() 등이 있다.

max(student_all_age)
## [1] 40
length(student_all_age)
## [1] 4
student_all_name <- c('영희', '철수', '은미', '재석')
summary(student_all_name)
##    Length     Class      Mode 
##         4 character character
student_all_class <- c('group1','group2', 'group1', 'group2' )
summary(student_all_class)
##    Length     Class      Mode 
##         4 character character

여기서 student_all_class 는 group12로 나뉘어 있는 것을 볼 수 있다. 이러한 개념은 팩터로 살펴볼 수 있다. 컴퓨터에게 sutdent_all_class가 팩터라는 것을 알려주자.

student_all_group <-factor(c('group1','group2', 'group1', 'group2' ))
summary(student_all_group)
## group1 group2 
##      2      2

group이 있으니 몇가지 쉬운 이용방법이 생겼다.

tapply(student_all_age, student_all_group, mean)
## group1 group2 
##   32.0   23.5

미리 이야기 하지만 *apply에 익수해져야한다. 이제, 1차원의 데이터 형식을 보았다. 메트릭스로 넘어 2차원의 자료를 살펴 보자

3.1.3 매트릭스 (Matrix), 데이터프래임 (data frame), 리스트 (list)

우리가 흔히 보았던 엑셀이나 표 형식의 데이터이다. 메트릭스는 행(row)와 열(column)로 구성되어 있고 백터 변수를 행을 기준으로 나열 할지, 열을 기준으로 할지 여부로 구성할 수 있다.

A1 = matrix( 
     c(1, 2, 3, 4, 5, 6, 7, 8),  # 값 
     nrow=2,                     # 행 갯수
     ncol=4,                     # 열 갯수
     byrow = TRUE)               # 행을 기준으로 순서대로
A1 # 출력
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8

그렇다면 똑 같이 1, 2, 3, 4, 5, 6, 7, 8를 이용해서 아래의 행렬을 만들어보자

##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    5    6
## [4,]    7    8

행렬이 행(column)에 같은 성질의 값 들로 이루어져 있다면 데이터프래임은 좀더 자유롭다고 볼 수 있다.

dspub_class <- data.frame(
  'name'  = student_all_name, 
  'age'   = student_all_age,
  'group' = student_all_group
)
dspub_class
##   name age  group
## 1 영희  24 group1
## 2 철수  31 group2
## 3 은미  40 group1
## 4 재석  16 group2

데이터프래임 부터는 tidyverse 패키지를 사용해서 몇가지를 보겠다. %>%는 pipe로 앞에 있는 것을 가지도 뒤에 명령을 하자는 조사 같은 것으로 이해하자. mutate는 가로 안에 있는 명령을 수행해서 새로운 변수를 만들라는 것이다.

library(tidyverse)
dspub_class %>%
  group_by(group) %>%
  summarize(avg = mean(age))
## # A tibble: 2 × 2
##   group    avg
##   <fct>  <dbl>
## 1 group1  32  
## 2 group2  23.5

과제가 있습니다. 과제는 DSpub내 group1 과 gropu2가 몇개인지와 최고 나이를 맞추는 것이다. 영희/철수에게 첫번째 숙제를, 은미/재석에게 두번째 숙제를 냈다. 과제를 받았다.

homework1 <- dspub_class %>%
  group_by(group) %>%
  mutate(avg_age = mean(age))
homework2 <- dspub_class %>%
  group_by(group) %>%
  mutate(max_age = max(age))
homework1
## # A tibble: 4 × 4
## # Groups:   group [2]
##   name    age group  avg_age
##   <chr> <dbl> <fct>    <dbl>
## 1 영희     24 group1    32  
## 2 철수     31 group2    23.5
## 3 은미     40 group1    32  
## 4 재석     16 group2    23.5
homework2
## # A tibble: 4 × 4
## # Groups:   group [2]
##   name    age group  max_age
##   <chr> <dbl> <fct>    <dbl>
## 1 영희     24 group1      40
## 2 철수     31 group2      31
## 3 은미     40 group1      40
## 4 재석     16 group2      31

이것을 어딘가에 저장하고 싶다, 이때 list를 사용할 수 있다.

second_week_dspub <-
  list(
       student_all_age,
       student_all_class,
       student_all_group,
       student_all_name,
       dspub_class, 
       homework1,
       homework2
       )
second_week_dspub
## [[1]]
## [1] 24 31 40 16
## 
## [[2]]
## [1] "group1" "group2" "group1" "group2"
## 
## [[3]]
## [1] group1 group2 group1 group2
## Levels: group1 group2
## 
## [[4]]
## [1] "영희" "철수" "은미" "재석"
## 
## [[5]]
##   name age  group
## 1 영희  24 group1
## 2 철수  31 group2
## 3 은미  40 group1
## 4 재석  16 group2
## 
## [[6]]
## # A tibble: 4 × 4
## # Groups:   group [2]
##   name    age group  avg_age
##   <chr> <dbl> <fct>    <dbl>
## 1 영희     24 group1    32  
## 2 철수     31 group2    23.5
## 3 은미     40 group1    32  
## 4 재석     16 group2    23.5
## 
## [[7]]
## # A tibble: 4 × 4
## # Groups:   group [2]
##   name    age group  max_age
##   <chr> <dbl> <fct>    <dbl>
## 1 영희     24 group1      40
## 2 철수     31 group2      31
## 3 은미     40 group1      40
## 4 재석     16 group2      31

숙제 과제만 뽑아 내서 보고 싶다면, 해당 list만 출력하면 된다. 즉 list에는 거의 모든 자료가 이질성을 갖고 있더라도 저장된다.

second_week_dspub[[7]]
## # A tibble: 4 × 4
## # Groups:   group [2]
##   name    age group  max_age
##   <chr> <dbl> <fct>    <dbl>
## 1 영희     24 group1      40
## 2 철수     31 group2      31
## 3 은미     40 group1      40
## 4 재석     16 group2      31

3.2 데이터 생성 저장

3.2.1 built-in data sets

R에서 기본적으로 제공되는 데이터는 data() 로 살펴볼 수 있다.

data()

이중 가장 유명한 데이터중 하나인 iris를 사용해 보자

data('iris')
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

잎의 길이와 넓이에 대한 상관관계를 그림으로 나타내 보자. 자세한 것은 시각화(visualization) 파트에서 다루겠다.

plot(iris$Sepal.Length, iris$Sepal.Width)

저번시간에 만들어 놓은 data 폴더에 iris를 csv 파일로 저장해 보자.

library(tidyverse)
write_csv(iris, "data/my_iris.csv")