tidyr Package

R Programming Basis

Description functions provided in tidyr Package

Yeongeun Jeon
06-29-2022

1. Package tidyr

Package tidyr (Ver. 1.2.0)는 “tidy”라는 영어 낱말 뜻(깔끔한, 잘 정돈한)처럼 데이터를 분석하기 쉽게 정리하는 데 도움을 주는 R 패키지이다. R에 입력된 데이터 세트는 대부분 바로 통계분석이 가능한 상태가 아니기 때문에 깔끔한 데이터(Tidy Data)로 정리하는 과정이 필요하다. 여기서, 깔끔한 데이터란 아래의 그림과 같이 1. 각 변수는 열에 해당하며, 2. 하나의 행은 하나의 관측을 의미하고, 3. 하나의 셀에는 하나의 관측값만 있는 데이터를 의미한다. 깔끔한 데이터는 표준화된 데이터 구조로 변수 및 관측치 추출이 용이하고, 모델링이 편하며 시각화가 쉬운 장점이 있다. 이러한 깔끔한 데이터를 만드는데 필요한 여러 함수가 Package tidyr에 포함되어 있다.

출처 : https://zorba78.github.io/cnu-r-programming-lecture-note/data-transformation.html

1-1. Package tidyr 내장 함수

Package tidyr의 대표적인 함수는 다음과 같다.


그 외에도 Package tidyr에 포함된 함수는 tidyr 설명 pdf, tidyr 홈페이지, 그리고 Cheat Sheet를 참고한다.


2. Package tidyr 설치

# 1. 기본적인 패키지 설치와 로드 방법NA# install.packages("tidyr")
library(tidyr)

# 2. p_load 이용하여 설치와 로드를 한꺼번에 # install.packages("pacman")    # For p_load
pacman::p_load("tidyr")          # pacman::p_load : pacman 패키지의 p_load함수 사용NA

Result! 함수 p_load()는 작성된 패키지가 설치 되어있지 않으면 설치 후 함수 library()를 자동적으로 실행한다.


3. 함수 pivot_longer()

출처 : https://zorba78.github.io/cnu-r-programming-lecture-note/data-transformation.html

Package tidyr에 내장된 데이터 프레임 “table4a”의 변수 “1999”와 “2000”에 입력된 관측값을 하나의 열로 모으기 위해 함수 pivot_longer() 적용

data(table4a)
table4a
# A tibble: 3 x 3
  country     `1999` `2000`
* <chr>        <int>  <int>
1 Afghanistan    745   2666
2 Brazil       37737  80488
3 China       212258 213766
# Ver. 1
table4a %>%
  pivot_longer(cols = c("1999", "2000"),
               names_to = "year",                        # 변수 이름 "1999"와 "2000"이 입력될 새로운 열 이름
               values_to = "cases")                      # 변수 "1999"와 "2000"에 입력된 값들을 합쳐서 나타낼 새로운 열 이름열 이름
# A tibble: 6 x 3
  country     year   cases
  <chr>       <chr>  <int>
1 Afghanistan 1999     745
2 Afghanistan 2000    2666
3 Brazil      1999   37737
4 Brazil      2000   80488
5 China       1999  212258
6 China       2000  213766
# Ver. 2
table4a %>%
  pivot_longer(cols = -country,
               names_to = "year",                        # 변수 이름 "1999"와 "2000"이 입력될 새로운 열 이름
               values_to = "cases")                      # 변수 "1999"와 "2000"에 입력된 값들을 합쳐서 나타낼 새로운 열 이름열 이름
# A tibble: 6 x 3
  country     year   cases
  <chr>       <chr>  <int>
1 Afghanistan 1999     745
2 Afghanistan 2000    2666
3 Brazil      1999   37737
4 Brazil      2000   80488
5 China       1999  212258
6 China       2000  213766

어떤 제품의 3년간 분기별 판매량이 df1이라고 할 때, 분기별 판매량을 하나의 열로 모으기 위해 함수 pivot_longer() 적용

df1 <- data.frame(Year = c(2019, 2020, 2021),
                  Q1   = c(102, 85, 97),
                  Q2   = c(158, 105, 136),
                  Q3   = c(135, 103, 123),
                  Q4   = c(147, 93, 114))
df1
  Year  Q1  Q2  Q3  Q4
1 2019 102 158 135 147
2 2020  85 105 103  93
3 2021  97 136 123 114
df1 %>%
  pivot_longer(cols      = -Year,
               names_to  = "Qtr",                         # 변수 이름 "Q1"~"Q4"가 입력될 새로운 열 이름이름
               values_to = "Sales")                       # 변수 "Q1"~"Q4"에 입력된 값들을 합쳐서 나타낼 새로운 열 이름열 이름
# A tibble: 12 x 3
    Year Qtr   Sales
   <dbl> <chr> <dbl>
 1  2019 Q1      102
 2  2019 Q2      158
 3  2019 Q3      135
 4  2019 Q4      147
 5  2020 Q1       85
 6  2020 Q2      105
 7  2020 Q3      103
 8  2020 Q4       93
 9  2021 Q1       97
10  2021 Q2      136
11  2021 Q3      123
12  2021 Q4      114

Package tidyr에 내장된 데이터 프레임 “billboard”의 변수 “wk1”부터 “wk76”까지 입력된 관측값을 하나의 열로 모으기 위해 함수 pivot_longer() 적용

Package tidyr에 있는 데이터 프레임 “billboard”에는 2000년 Billboard Top 100에 오른 노래의 가수(“artist”)와 노래 제목(“track”), top 100 리스트에 들어간 날짜(“data.entered”), 그리고 리스트에 오른 이후의 매주 순위가 변수 “wk1”부터 “wk76”까지 입력되어 있다. 원하는 분석은 매주 연속해서 top 100에 올라있던 노래만을 대상으로 리스트에 머물러 있던 최장 기간과 그 기간 중 최고 순위를 알아내는 것이기 때문에 변수 “wk1”부터 “wk76”까지에 이벽된 값들은 하나의 열에 입력되어야 적절한 통계분석이 가능하다.

data(billboard)
billboard
# A tibble: 317 x 79
   artist track date.entered   wk1   wk2   wk3   wk4   wk5   wk6   wk7
   <chr>  <chr> <date>       <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1 2 Pac  Baby~ 2000-02-26      87    82    72    77    87    94    99
 2 2Ge+h~ The ~ 2000-09-02      91    87    92    NA    NA    NA    NA
 3 3 Doo~ Kryp~ 2000-04-08      81    70    68    67    66    57    54
 4 3 Doo~ Loser 2000-10-21      76    76    72    69    67    65    55
 5 504 B~ Wobb~ 2000-04-15      57    34    25    17    17    31    36
 6 98^0   Give~ 2000-08-19      51    39    34    26    26    19     2
 7 A*Tee~ Danc~ 2000-07-08      97    97    96    95   100    NA    NA
 8 Aaliy~ I Do~ 2000-01-29      84    62    51    41    38    35    35
 9 Aaliy~ Try ~ 2000-03-18      59    53    38    28    21    18    16
10 Adams~ Open~ 2000-08-26      76    76    74    69    68    67    61
# ... with 307 more rows, and 69 more variables: wk8 <dbl>,
#   wk9 <dbl>, wk10 <dbl>, wk11 <dbl>, wk12 <dbl>, wk13 <dbl>,
#   wk14 <dbl>, wk15 <dbl>, wk16 <dbl>, wk17 <dbl>, wk18 <dbl>,
#   wk19 <dbl>, wk20 <dbl>, wk21 <dbl>, wk22 <dbl>, wk23 <dbl>,
#   wk24 <dbl>, wk25 <dbl>, wk26 <dbl>, wk27 <dbl>, wk28 <dbl>,
#   wk29 <dbl>, wk30 <dbl>, wk31 <dbl>, wk32 <dbl>, wk33 <dbl>,
#   wk34 <dbl>, wk35 <dbl>, wk36 <dbl>, wk37 <dbl>, wk38 <dbl>, ...
billboard %>%
  head(5)
# A tibble: 5 x 79
  artist  track date.entered   wk1   wk2   wk3   wk4   wk5   wk6   wk7
  <chr>   <chr> <date>       <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2 Pac   Baby~ 2000-02-26      87    82    72    77    87    94    99
2 2Ge+her The ~ 2000-09-02      91    87    92    NA    NA    NA    NA
3 3 Door~ Kryp~ 2000-04-08      81    70    68    67    66    57    54
4 3 Door~ Loser 2000-10-21      76    76    72    69    67    65    55
5 504 Bo~ Wobb~ 2000-04-15      57    34    25    17    17    31    36
# ... with 69 more variables: wk8 <dbl>, wk9 <dbl>, wk10 <dbl>,
#   wk11 <dbl>, wk12 <dbl>, wk13 <dbl>, wk14 <dbl>, wk15 <dbl>,
#   wk16 <dbl>, wk17 <dbl>, wk18 <dbl>, wk19 <dbl>, wk20 <dbl>,
#   wk21 <dbl>, wk22 <dbl>, wk23 <dbl>, wk24 <dbl>, wk25 <dbl>,
#   wk26 <dbl>, wk27 <dbl>, wk28 <dbl>, wk29 <dbl>, wk30 <dbl>,
#   wk31 <dbl>, wk32 <dbl>, wk33 <dbl>, wk34 <dbl>, wk35 <dbl>,
#   wk36 <dbl>, wk37 <dbl>, wk38 <dbl>, wk39 <dbl>, wk40 <dbl>, ...
billboard %>%
  pivot_longer(cols            = wk1:wk76,                    # Or starts_with("wk")
               names_to        = "week",                      # 변수 이름 "wk1"~"wk76"이 입력될 새로운 열 이름
               names_prefix    = "wk",                        # 변수 week의 입력값에서 "wk" 단어 제외제외
               names_transform = list(week = as.integer),     # 변수 week의 데이터 유형을 정수형으로 변환NA= "rank",                      # 변수 "wk1"~"wk76"에 입력된 값들을 합쳐서 나타낼 새로운 열 이름열 이름
               values_drop_na  = TRUE) %>%                    # 변수 rank의 NA값 제거head(10)
# A tibble: 10 x 5
   artist  track                   date.entered  week  rank
   <chr>   <chr>                   <date>       <int> <dbl>
 1 2 Pac   Baby Don't Cry (Keep... 2000-02-26       1    87
 2 2 Pac   Baby Don't Cry (Keep... 2000-02-26       2    82
 3 2 Pac   Baby Don't Cry (Keep... 2000-02-26       3    72
 4 2 Pac   Baby Don't Cry (Keep... 2000-02-26       4    77
 5 2 Pac   Baby Don't Cry (Keep... 2000-02-26       5    87
 6 2 Pac   Baby Don't Cry (Keep... 2000-02-26       6    94
 7 2 Pac   Baby Don't Cry (Keep... 2000-02-26       7    99
 8 2Ge+her The Hardest Part Of ... 2000-09-02       1    91
 9 2Ge+her The Hardest Part Of ... 2000-09-02       2    87
10 2Ge+her The Hardest Part Of ... 2000-09-02       3    92

Caution! 옵션 names_prefixnames_to에 입력된 열 이름에서 제거하려는 문자열에 정규표현식을 지정하면 되는데, 첫 문자부터 제거하는 경우에는 그냥 제거하는 문자열을 입력한다. 옵션 names_transformnames_to에 입력된 열 이름의 유형을 변경할 때 사용한다. 또한, values_to에 입력된 관측값에 NA값을 제거하기 위해 옵션 values_drop_na = TRUE을 지정한다.


4. 함수 pivot_wider()

출처 : https://zorba78.github.io/cnu-r-programming-lecture-note/data-transformation.html

Package tidyr에 내장된 데이터 프레임 “table2”의 변수 “type”에 입력되어 있는 두 변수를 분리하기 위해 함수 pivot_wider() 적용

table2
# A tibble: 12 x 4
   country      year type            count
   <chr>       <int> <chr>           <int>
 1 Afghanistan  1999 cases             745
 2 Afghanistan  1999 population   19987071
 3 Afghanistan  2000 cases            2666
 4 Afghanistan  2000 population   20595360
 5 Brazil       1999 cases           37737
 6 Brazil       1999 population  172006362
 7 Brazil       2000 cases           80488
 8 Brazil       2000 population  174504898
 9 China        1999 cases          212258
10 China        1999 population 1272915272
11 China        2000 cases          213766
12 China        2000 population 1280428583
table2 %>%
  pivot_wider(names_from  = "type",
              values_from = "count")
# A tibble: 6 x 4
  country      year  cases population
  <chr>       <int>  <int>      <int>
1 Afghanistan  1999    745   19987071
2 Afghanistan  2000   2666   20595360
3 Brazil       1999  37737  172006362
4 Brazil       2000  80488  174504898
5 China        1999 212258 1272915272
6 China        2000 213766 1280428583

세 명의 신장과 체중을 입력한 데이터 프레임 df2에서 변수 “type”에 입력되어 있는 두 변수를 분리하기 위해 함수 pivot_wider() 적용

df2 <- data.frame(Name    = rep(c("Kim", "Kwon", "Son", "Lim"), each = 2),
                  type    = rep(c("Height", "Weight"), times = 4),
                  measure = c(175, 75, 165, 55, 168, 53, 150, 46))

df2
  Name   type measure
1  Kim Height     175
2  Kim Weight      75
3 Kwon Height     165
4 Kwon Weight      55
5  Son Height     168
6  Son Weight      53
7  Lim Height     150
8  Lim Weight      46
df2 %>%
  pivot_wider(names_from  = "type",
              values_from = "measure")
# A tibble: 4 x 3
  Name  Height Weight
  <fct>  <dbl>  <dbl>
1 Kim      175     75
2 Kwon     165     55
3 Son      168     53
4 Lim      150     46

Package tidyr에 내장된 데이터 프레임 “fish_encounters”의 변수 “station”에 입력되어 있는 변수를 분리하기 위해 함수 pivot_wider() 적용

fish_encounters
# A tibble: 114 x 3
   fish  station  seen
   <fct> <fct>   <int>
 1 4842  Release     1
 2 4842  I80_1       1
 3 4842  Lisbon      1
 4 4842  Rstr        1
 5 4842  Base_TD     1
 6 4842  BCE         1
 7 4842  BCW         1
 8 4842  BCE2        1
 9 4842  BCW2        1
10 4842  MAE         1
# ... with 104 more rows
fish_encounters %>%
  pivot_wider(names_from  = "station",
              values_from = "seen",
              values_fill = 0)                         # NA값 0으로 대체
# A tibble: 19 x 12
   fish  Release I80_1 Lisbon  Rstr Base_TD   BCE   BCW  BCE2  BCW2
   <fct>   <int> <int>  <int> <int>   <int> <int> <int> <int> <int>
 1 4842        1     1      1     1       1     1     1     1     1
 2 4843        1     1      1     1       1     1     1     1     1
 3 4844        1     1      1     1       1     1     1     1     1
 4 4845        1     1      1     1       1     0     0     0     0
 5 4847        1     1      1     0       0     0     0     0     0
 6 4848        1     1      1     1       0     0     0     0     0
 7 4849        1     1      0     0       0     0     0     0     0
 8 4850        1     1      0     1       1     1     1     0     0
 9 4851        1     1      0     0       0     0     0     0     0
10 4854        1     1      0     0       0     0     0     0     0
11 4855        1     1      1     1       1     0     0     0     0
12 4857        1     1      1     1       1     1     1     1     1
13 4858        1     1      1     1       1     1     1     1     1
14 4859        1     1      1     1       1     0     0     0     0
15 4861        1     1      1     1       1     1     1     1     1
16 4862        1     1      1     1       1     1     1     1     1
17 4863        1     1      0     0       0     0     0     0     0
18 4864        1     1      0     0       0     0     0     0     0
19 4865        1     1      1     0       0     0     0     0     0
# ... with 2 more variables: MAE <int>, MAW <int>

5. 함수 separate()


Package tidyr에 내장된 데이터 프레임 “table3”의 변수 “rate”에 입력되어 있는 두 관측값을 분리하기 위해 함수 separate() 적용

table3
# A tibble: 6 x 3
  country      year rate             
* <chr>       <int> <chr>            
1 Afghanistan  1999 745/19987071     
2 Afghanistan  2000 2666/20595360    
3 Brazil       1999 37737/172006362  
4 Brazil       2000 80488/174504898  
5 China        1999 212258/1272915272
6 China        2000 213766/1280428583
table3 %>%
  separate(col  = "rate",
           into = c("cases", "population"),
           sep  = "/")
# A tibble: 6 x 4
  country      year cases  population
  <chr>       <int> <chr>  <chr>     
1 Afghanistan  1999 745    19987071  
2 Afghanistan  2000 2666   20595360  
3 Brazil       1999 37737  172006362 
4 Brazil       2000 80488  174504898 
5 China        1999 212258 1272915272
6 China        2000 213766 1280428583

데이터 프레임 “df3”의 변수 “Date”에 입력되어 있는 두 문자열을 분리하기 위해 함수 separate() 적용

df3 <- data.frame(Date  = c("2020-Qtr.1", "2020-Qtr.2", "2020-Qtr.3", "2020-Qtr.3"),
                  Sales = c(102, 95, 119, 99))
df3
        Date Sales
1 2020-Qtr.1   102
2 2020-Qtr.2    95
3 2020-Qtr.3   119
4 2020-Qtr.3    99
df3 %>%
  separate(col  = "Date",
           into = c("Year", "Qtr"),
           sep  = "-")
  Year   Qtr Sales
1 2020 Qtr.1   102
2 2020 Qtr.2    95
3 2020 Qtr.3   119
4 2020 Qtr.3    99

데이터 프레임 “df4”의 변수 “Date”에 입력되어 있는 두 문자열을 분리하기 위해 함수 separate() 적용

df4 <- data.frame(Date  = c("2020Q1", "2020Q2", "2020Q3", "2020Q3"),
                  Sales = c(102, 95, 119, 99))
df4
    Date Sales
1 2020Q1   102
2 2020Q2    95
3 2020Q3   119
4 2020Q3    99
df4 %>%
  separate(col  = "Date",
           into = c("Year", "Qtr"),
           sep  = 4)                                     # Or -2
  Year Qtr Sales
1 2020  Q1   102
2 2020  Q2    95
3 2020  Q3   119
4 2020  Q3    99

Caution! 옵션 sep에 양의 정수를 입력하면 왼쪽 끝을 기준으로 입력값 위치에서 분리되고, 음의 정수를 입력하면 오른쪽 끝을 기준으로 입력값의 위치에서 분리된다.


Caution! 함수 separate()는 하나의 열에 입력된 문자열을 분리하는 데 사용되는 함수이다. 하지만, 하나의 열의 데이터를 분리한 후 다시 하나의 열로 만들고 싶다면 함수 separate_rows(data, 분리하고 싶은 열, sep)를 사용할 수 있다.

df5 <- data.frame(Contry = c("A", "B", "C"),
                  Year   = 2000,
                  Rate   = c("0.4/0.6", "1.2/0.3", "0.9/1.5"))

df5
  Contry Year    Rate
1      A 2000 0.4/0.6
2      B 2000 1.2/0.3
3      C 2000 0.9/1.5
df5 %>%
  separate_rows("Rate",                                           # 분리하고 싶은 열열
                sep = "/")                                        # 구분자
# A tibble: 6 x 3
  Contry  Year Rate 
  <fct>  <dbl> <chr>
1 A       2000 0.4  
2 A       2000 0.6  
3 B       2000 1.2  
4 B       2000 0.3  
5 C       2000 0.9  
6 C       2000 1.5  

6. 함수 unite()


Package tidyr에 내장된 데이터 프레임 “table5”의 변수 “century”과 “year”에 입력되어 있는 두 데이터를 하나의 열로 합치기 위해 함수 unite() 적용

table5
# A tibble: 6 x 4
  country     century year  rate             
* <chr>       <chr>   <chr> <chr>            
1 Afghanistan 19      99    745/19987071     
2 Afghanistan 20      00    2666/20595360    
3 Brazil      19      99    37737/172006362  
4 Brazil      20      00    80488/174504898  
5 China       19      99    212258/1272915272
6 China       20      00    213766/1280428583
table5 %>%
  unite(col = year,                   # 합쳐서 새롭게 생성될 열 이름  
        century, year,                # 합쳐질 열NA= "-")
# A tibble: 6 x 3
  country     year  rate             
  <chr>       <chr> <chr>            
1 Afghanistan 19-99 745/19987071     
2 Afghanistan 20-00 2666/20595360    
3 Brazil      19-99 37737/172006362  
4 Brazil      20-00 80488/174504898  
5 China       19-99 212258/1272915272
6 China       20-00 213766/1280428583

데이터 프레임 “df6”의 변수 “Year”과 “Qtr”에 입력되어 있는 두 데이터를 하나의 열로 합치기 위해 함수 unite() 적용

df6 <- data.frame(Year = "2020",
                  Qtr = c("Q1", "Q2", "Q3", "Q4"),
                  Sales = c(102, 95, 119, 99))
df6 
  Year Qtr Sales
1 2020  Q1   102
2 2020  Q2    95
3 2020  Q3   119
4 2020  Q4    99
df6 %>%
  unite(col = "Date",               # 합쳐서 새롭게 생성될 열 이름  
        Year, Qtr,                  # 합쳐질 열NA= "/")
     Date Sales
1 2020/Q1   102
2 2020/Q2    95
3 2020/Q3   119
4 2020/Q4    99

7. 함수 nest()

data(mtcars)

mtcars_cyl <- mtcars %>%
  dplyr::group_by(cyl) %>%
  nest()

mtcars_cyl
# A tibble: 3 x 2
# Groups:   cyl [3]
    cyl data              
  <dbl> <list>            
1     6 <tibble [7 x 10]> 
2     4 <tibble [11 x 10]>
3     8 <tibble [14 x 10]>

Result! 변수 “cyl”에 따른 데이터를 리스트 형식의 열(“data”)로 생성하였다.

mtcars_cyl$data
[[1]]
# A tibble: 7 x 10
    mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1  21    160    110  3.9   2.62  16.5     0     1     4     4
2  21    160    110  3.9   2.88  17.0     0     1     4     4
3  21.4  258    110  3.08  3.22  19.4     1     0     3     1
4  18.1  225    105  2.76  3.46  20.2     1     0     3     1
5  19.2  168.   123  3.92  3.44  18.3     1     0     4     4
6  17.8  168.   123  3.92  3.44  18.9     1     0     4     4
7  19.7  145    175  3.62  2.77  15.5     0     1     5     6

[[2]]
# A tibble: 11 x 10
     mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  22.8 108      93  3.85  2.32  18.6     1     1     4     1
 2  24.4 147.     62  3.69  3.19  20       1     0     4     2
 3  22.8 141.     95  3.92  3.15  22.9     1     0     4     2
 4  32.4  78.7    66  4.08  2.2   19.5     1     1     4     1
 5  30.4  75.7    52  4.93  1.62  18.5     1     1     4     2
 6  33.9  71.1    65  4.22  1.84  19.9     1     1     4     1
 7  21.5 120.     97  3.7   2.46  20.0     1     0     3     1
 8  27.3  79      66  4.08  1.94  18.9     1     1     4     1
 9  26   120.     91  4.43  2.14  16.7     0     1     5     2
10  30.4  95.1   113  3.77  1.51  16.9     1     1     5     2
11  21.4 121     109  4.11  2.78  18.6     1     1     4     2

[[3]]
# A tibble: 14 x 10
     mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  18.7  360    175  3.15  3.44  17.0     0     0     3     2
 2  14.3  360    245  3.21  3.57  15.8     0     0     3     4
 3  16.4  276.   180  3.07  4.07  17.4     0     0     3     3
 4  17.3  276.   180  3.07  3.73  17.6     0     0     3     3
 5  15.2  276.   180  3.07  3.78  18       0     0     3     3
 6  10.4  472    205  2.93  5.25  18.0     0     0     3     4
 7  10.4  460    215  3     5.42  17.8     0     0     3     4
 8  14.7  440    230  3.23  5.34  17.4     0     0     3     4
 9  15.5  318    150  2.76  3.52  16.9     0     0     3     2
10  15.2  304    150  3.15  3.44  17.3     0     0     3     2
11  13.3  350    245  3.73  3.84  15.4     0     0     3     4
12  19.2  400    175  3.08  3.84  17.0     0     0     3     2
13  15.8  351    264  4.22  3.17  14.5     0     1     5     4
14  15    301    335  3.54  3.57  14.6     0     1     5     8

Caution! 리스트 형식의 열을 데이터 프레임의 열로 수정하기 위해서는 함수 unnest()를 사용하면 된다.

unnest(mtcars_cyl, cols = data)
# A tibble: 32 x 11
# Groups:   cyl [3]
     cyl   mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1     6  21    160    110  3.9   2.62  16.5     0     1     4     4
 2     6  21    160    110  3.9   2.88  17.0     0     1     4     4
 3     6  21.4  258    110  3.08  3.22  19.4     1     0     3     1
 4     6  18.1  225    105  2.76  3.46  20.2     1     0     3     1
 5     6  19.2  168.   123  3.92  3.44  18.3     1     0     4     4
 6     6  17.8  168.   123  3.92  3.44  18.9     1     0     4     4
 7     6  19.7  145    175  3.62  2.77  15.5     0     1     5     6
 8     4  22.8  108     93  3.85  2.32  18.6     1     1     4     1
 9     4  24.4  147.    62  3.69  3.19  20       1     0     4     2
10     4  22.8  141.    95  3.92  3.15  22.9     1     0     4     2
# ... with 22 more rows

8. 함수 drop_na()

df7 <- data.frame(x = c(1:4, NA, 5, NA, 6:8, NA),
                  y = c(1, NA, 10, 8, 3, 5, 8, NA, 0, 2, 2))
df7
    x  y
1   1  1
2   2 NA
3   3 10
4   4  8
5  NA  3
6   5  5
7  NA  8
8   6 NA
9   7  0
10  8  2
11 NA  2
# 어떤 변수든지 NA가 포함되어 있는 행 모두 제거NAdf7 %>%
  drop_na()
  x  y
1 1  1
2 3 10
3 4  8
4 5  5
5 7  0
6 8  2
# 변수 x의 값이 NA인 행 제거NAdf7 %>%
  drop_na(x) 
  x  y
1 1  1
2 2 NA
3 3 10
4 4  8
5 5  5
6 6 NA
7 7  0
8 8  2

9. 함수 replace_na()

df7 <- data.frame(x = c(1:4, NA, 5, NA, 6:8, NA),
                  y = c(1, NA, 10, 8, 3, 5, 8, NA, 0, 2, 2))
df7
    x  y
1   1  1
2   2 NA
3   3 10
4   4  8
5  NA  3
6   5  5
7  NA  8
8   6 NA
9   7  0
10  8  2
11 NA  2
df7 %>%
  replace_na(list(x = 5))
   x  y
1  1  1
2  2 NA
3  3 10
4  4  8
5  5  3
6  5  5
7  5  8
8  6 NA
9  7  0
10 8  2
11 5  2
df7 %>%
  replace_na(list(x = 5, 
                  y = 7))
   x  y
1  1  1
2  2  7
3  3 10
4  4  8
5  5  3
6  5  5
7  5  8
8  6  7
9  7  0
10 8  2
11 5  2

Reuse

Text and figures are licensed under Creative Commons Attribution CC BY 4.0. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".