정보

    • 업무명     : R을 이용한 통계 분석 및 데이터 시각화 : dplyr

    • 작성자     : 박진만

    • 작성일     : 2020-04-09

    • 설   명      :

    • 수정이력 :

     

     내용

    [개요]

    • R은 통계 분석 및 시각화 등의 기능을 갖춘 프로그래밍 언어 내지 통계 분석 환경입니다. 

    • 통계 분석 기능으로 통계 검정, 선형 회귀 분석, 시계열 데이터 분석, 클러스터링 등을 지원하고 있습니다.

    • 또한 최신 논문에서 발표된 같은 새로운 기술도 R로 구현되는 경우가 많습니다.

    • 특히 시각화 기능으로 히스토그램, 막대 그래프, 선 그래프, 산포도, 나무 모양 그림이나 히트맵 등 기본적인 그래프가 기본으로 지원하고 있습니다.

    • 또한 ggplot2 등의 패키지를 사용하여 더 높은 수준의 그림을 가시화할 수 있습니다.

     

     

    [특징]

    • 데이터를 이해하기 위해서 통계 분석 및 데이터 시각화가 요구되며 이 프로그램은 이러한 목적을 달성하기 위한 소프트웨어

       

    [기능]

    • 데이터형 소개

     

    [활용 자료]

    • 없음

     

    [자료 처리 방안 및 활용 분석 기법]

    • 없음

     

    [사용법]

    • 소스 코드 예시 참조

     

    [사용 OS]

    • Windows 10

     

    [사용 언어]

    • R v3.6.2

    • R Studio v1.2.5033

     

     소스 코드

    [dplyr]

    • dplyr는 데이터프레임 조작에 특화된 R 패키지이다. 

    • dplyr 패키지는 데이터프레임 형태의 데이터 중 일부를 추출 할 수 있는 함수와 추출 된 하위 집합을 집계하는 함수 등이 다수 포함되어 있다.

    • dplyr에서 취급하는 데이터는 수백 MB에서 2 GB 전후의 크기를 상정하고 있다.이 크기를 초과하는 10 ~ 100 GB 대규모 빅 데이터 등을 취급하는 경우 data.table 패키지를 사용하는 것이 좋다.

    • dplyr 함수는 작성하는 방법이 매우 간단하고 가독성이 좋다. dplyr을 사용함으로써, 연구자들은 데이터의 조작이나 집계에 집중할 수 있으며, 불필요한 코드를 작성하지 않아도 된다.

     

    [dplyr 패키지를 사용하지 않는 데이터 조작 예시]

    • R은 데이터 프레임 중에서의 조건을 만족하는 부분 집합을 추출하고 그 부분 집합의 평균을 구하거나 하는 작업을 수행할 수 있다.

    • 여기서는 rice 데이터 세트를 사용하여 데이터를 조작하는 방법을 보여준다. 

    • rice 데이터 세트는 7 열을 가지며 각각의 열이 개체 번호 (replicate) 블록 번호 (block), 뿌리 부분 건조 중량 (root_dry_mass) 지상부 건조 중량 (shoot_dry_mass) 계통 처리 (trt), 처리 (fert) 계통 (variety)로 구성된다.

    d <- read.table('data/rice.txt', header = TRUE, sep = '\t')
    head(d)
    ##   replicate block root_dry_mass shoot_dry_mass trt fert variety
    ## 1         1     1            56            132 F10  F10      wt
    ## 2         2     1            66            120 F10  F10      wt
    ## 3         3     1            40            108 F10  F10      wt
    ## 4         4     1            43            134 F10  F10      wt
    ## 5         5     1            55            119 F10  F10      wt
    ## 6         6     1            66            125 F10  F10      wt

     

    • 여기에서 예를 들어, 각 계통 (wt 계통 및 ANU843 계통)에 대해 근부 건조 중량을 요구하는 경우, 데이터 프레임에 대해 다음과 같은 작업을 수행하여 계산할 수있다.

    wt <- d$root_dry_mass[d$variety == 'wt']
    ANU843 <- d$root_dry_mass[d$variety == 'ANU843']
    
    print(mean(wt))
    ## [1] 26.47222
    
    print(mean(ANU843))
    ## [1] 9.666667
    

     

    • 평균 · 최대 · 최소치 등의 간단한 값을 구할 때도 역시 R의 표준 함수 중 하나 인 aggregate 함수를 사용하면 편리하다.

    aggregate(d$root_dry_mass, by = list(variety = d$variety), mean)
    ##   variety         x
    ## 1  ANU843  9.666667
    ## 2      wt 26.472222
    

     

    • 그리고 wt 계통과 ANU843 계통의 각 처리 군 각각에 대해 근부 건조 무게의 평균을 계산하려면 아래와 같이 작성한다.

    wt.F10 <- d$root_dry_mass[d$variety == 'wt' & d$fert == 'F10']
    wt.NH4Cl <- d$root_dry_mass[d$variety == 'wt' & d$fert == 'NH4Cl']
    wt.NH4NO3 <- d$root_dry_mass[d$variety == 'wt' & d$fert == 'NH4NO3']
    ANU843.F10 <- d$root_dry_mass[d$variety == 'ANU843' & d$fert == 'F10']
    ANU843.NH4Cl <- d$root_dry_mass[d$variety == 'ANU843' & d$fert == 'NH4Cl']
    ANU843.NH4NO3 <- d$root_dry_mass[d$variety == 'ANU843' & d$fert == 'NH4NO3']
    
    m <- c(mean(wt.F10), mean(wt.NH4Cl), mean(wt.NH4NO3),
           mean(ANU843.F10), mean(ANU843.NH4Cl), mean(ANU843.NH4NO3))
    print(m)
    ## [1] 49.500000 12.583333 17.333333  6.000000  9.166667 13.833333

     

    • 여러 조건의 조합으로 aggregate함수를 사용할 수있다. 예를 들어 다음과 같이 by 옵션 두 가지 조건을 주면된다.

    aggregate(d$root_dry_mass, by = list(variety = d$variety, fert = d$fert), mean)
    ##   variety   fert         x
    ## 1  ANU843    F10  6.000000
    ## 2      wt    F10 49.500000
    ## 3  ANU843  NH4Cl  9.166667
    ## 4      wt  NH4Cl 12.583333
    ## 5  ANU843 NH4NO3 13.833333
    ## 6      wt NH4NO3 17.333333

     

    [dplyr의 기본적인 사용법]

    • dplyr를 사용하여 데이터 작업을 처리 할 때 데이터의 흐름에 주목하면 알기 쉽다.

    • 예를 들어, d는 데이터에 대해 A 처리를 행한 후 B 처리를 실시해, 그 결과를 x로 저장하고 싶은 경우는 d → A → B → x라는 흐름에 주목하면 dplyr 규칙에 따라 아래와 같은 흐름 구조를 지닌다.

    • d의 내용을 함수 A에 흐르는 때 %>%연산자를 사용한다. 다음으로 A 함수에서 처리 한 결과를 B 함수 흘리는 때처럼 %>%연산자를 사용한다. 마지막으로, 함수 B의 처리 결과를 x에 대입 하고자 하므로,  R의 기본 문법에 따라 ->를 사용한다.

    d %>% A %>% B -> x
    

     

    • 또한 프로그래밍 언어에서는 대입 연산자의 오른쪽 연산 결과를 왼쪽에 대입한다는 암시 규칙이 있기 때문에, 다음과 같이 쓰는 것이 일반적이다.

    x <- d %>% A %>% B
    

     

    • 위와 같은 dplyr 규칙을 바탕으로 wt 계통의 개체수를 요구하려면, 아래와 같이 할 수 있다.

    • 즉 데이터 d를 group_by함수에 흘려 여기 variety별로 그룹화한다. 그리고 그룹화를 행한 후, 각 그룹을 더 다음 summarise함수에 흘려 평균을 구할 처리를 행하고있다.

    d <- read_tsv('data/rice.txt')
    head(d)
    ## # A tibble: 6 x 7
    ##   replicate block root_dry_mass shoot_dry_mass trt   fert  variety
    ##       <dbl> <dbl>         <dbl>          <dbl> <chr> <chr> <chr>
    ## 1         1     1            56            132 F10   F10   wt     
    ## 2         2     1            66            120 F10   F10   wt     
    ## 3         3     1            40            108 F10   F10   wt     
    ## 4         4     1            43            134 F10   F10   wt     
    ## 5         5     1            55            119 F10   F10   wt     
    ## 6         6     1            66            125 F10   F10   wt
    
    
    variety_ave <- d %>% 
                    group_by(variety) %>%
                    summarise(mass_ave = mean(root_dry_mass))
    head(variety_ave)
    ## # A tibble: 2 x 2
    ##   variety mass_ave
    ##   <chr>      <dbl>
    ## 1 ANU843      9.67
    ## 2 wt         26.5

     

    • 각 계통의 각 처리 군에 대해 평균을 구할 경우, aggregate함수와 마찬가지로 group_by에 조건을 쓰면 좋다.

    variety_ave <- d %>% 
                    group_by(variety, fert) %>%
                    summarise(mass_ave = mean(root_dry_mass))
    head(variety_ave)
    ## # A tibble: 6 x 3
    ## # Groups:   variety [2]
    ##   variety fert   mass_ave
    ##   <chr>   <chr>     <dbl>
    ## 1 ANU843  F10        6   
    ## 2 ANU843  NH4Cl      9.17
    ## 3 ANU843  NH4NO3    13.8 
    ## 4 wt      F10       49.5 
    ## 5 wt      NH4Cl     12.6 
    ## 6 wt      NH4NO3    17.3
    • 이처럼 dplyr는 데이터의 흐름에 주목하여 데이터의 조작이나 집계를 해나 갈 수있다. 연구자가 데이터 조작 데이터 집계에 관계없이 코드를 작성할 필요없이 효율적이다.

     

    [dplyr의 기본 함수]

    • dplyr 패키지에서 자주 사용하는 함수에는 다음과 같은 것이 있다.

    함수 동작
    select 주어진 조건에 따라 특정 열을 추출한다.
    filter 주어진 조건에 따라 특정 행을 추출한다.
    arrange 주어진 조건에 따라 행을 정렬합니다.
    group_by 주어진 조건에 따라 전체 데이터 집합을 여러 그룹으로 나눈다.
    summarise 최대 · 최소 · 평균치를 요구하는 등의 데이터의 집계를 실시한다.
    mutate 기존 데이터 세트에 새 열을 추가한다.

     

    [dplyr::select 함수]

    • select함수는 주어진 조건에 따라 특정 열을 추출하는 함수이다.

    • 예를 들어 rice 데이터 세트에서 계통 (variety), 처리 (fert), 뿌리 부분 건조 중량 (root_dry_mass) 지상부 건조 중량 (shoot_dry_mass)의 4 열만을 꺼내 집합을 만들려면 아래와 같이 작성한다.

    # d.subset <- d[, c('variety', 'fert', 'root_dry_mass', 'shoot_dry_mass')]
    d.subset <- d %>% select(variety, fert, root_dry_mass, shoot_dry_mass)
    head(d.subset)
    ## # A tibble: 6 x 4
    ##   variety fert  root_dry_mass shoot_dry_mass
    ##   <chr>   <chr>         <dbl>          <dbl>
    ## 1 wt      F10              56            132
    ## 2 wt      F10              66            120
    ## 3 wt      F10              40            108
    ## 4 wt      F10              43            134
    ## 5 wt      F10              55            119
    ## 6 wt      F10              66            125

     

    • select 함수에 열 이름을 지정할 때 -를 쓰면 열을 포함하지 않도록 하는 하위 집합이 생성된다.

    # d.subset <- d[, -c('replicate', 'block', 'trt')]
    d.subset <- d %>% select(-replicate, -block, -trt)
    head(d.subset)
    ## # A tibble: 6 x 4
    ##   root_dry_mass shoot_dry_mass fert  variety
    ##           <dbl>          <dbl> <chr> <chr>  
    ## 1            56            132 F10   wt     
    ## 2            66            120 F10   wt     
    ## 3            40            108 F10   wt     
    ## 4            43            134 F10   wt     
    ## 5            55            119 F10   wt     
    ## 6            66            125 F10   wt

     

     

    • select함수에 열 이름이 아니라 조건을 이용하여 열을 추출 할 수있다. 예를 들어, 열 이름에 mass를 포함하는 열을 추출하려면 아래와 같이 작성한다.

    d.subset <- d %>% select(contains('mass'))
    head(d.subset)
    ## # A tibble: 6 x 2
    ##   root_dry_mass shoot_dry_mass
    ##           <dbl>          <dbl>
    ## 1            56            132
    ## 2            66            120
    ## 3            40            108
    ## 4            43            134
    ## 5            55            119
    ## 6            66            125
    • 조건을 줄 때 사용하는 contains함수 외에 starts_with, ends_with, matches 등의 기능도 사용할 수 있다.

     

    [dplyr::filter 함수]

    • filter함수는 주어진 조건에 따라 특정 행을 추출하는 함수이다. 예를 들어, 근부 건조 중량이 50 개 이상의 행을 추출하려면 아래와 같이 작성한다.

    d.subset <- d %>% filter(root_dry_mass > 50)
    head(d.subset)
    ## # A tibble: 5 x 7
    ##   replicate block root_dry_mass shoot_dry_mass trt   fert  variety
    ##       <dbl> <dbl>         <dbl>          <dbl> <chr> <chr> <chr>  
    ## 1         1     1            56            132 F10   F10   wt     
    ## 2         2     1            66            120 F10   F10   wt     
    ## 3         5     1            55            119 F10   F10   wt     
    ## 4         6     1            66            125 F10   F10   wt     
    ## 5         8     2            67            122 F10   F10   wt

     

    • 조건이 여러 개인 경우, 그 조건을 차례로 filter 함수에 입력하면 좋다. 예를 들어, wt 계통과 근부 건조 중량이 50 개 이상의 행을 추출하려면 아래와 같이 작성한다.

    d.subset <- d %>% filter(root_dry_mass >= 50, variety == 'wt')
    head(d.subset)
    ## # A tibble: 5 x 7
    ##   replicate block root_dry_mass shoot_dry_mass trt   fert  variety
    ##       <dbl> <dbl>         <dbl>          <dbl> <chr> <chr> <chr>  
    ## 1         1     1            56            132 F10   F10   wt     
    ## 2         2     1            66            120 F10   F10   wt     
    ## 3         5     1            55            119 F10   F10   wt     
    ## 4         6     1            66            125 F10   F10   wt     
    ## 5         8     2            67            122 F10   F10   wt

     

    • 여러 조건의 경우 &및 |을 사용하여 AND 연산과 OR 연산을 할 수 있다.

    • 예를 들어, "wt 계통" and "근부 건조 중량이 50 이상" and "지상부 건조 중량이 120 이상" 의 3 가지 조건을 동시에 충족시키는 행을 추출하려면 아래와 같이 작성한다.

    • 또한 여러 조건을 쉼표로 구분하여 제공하는 경우 AND 연산의 결과완 동일하게 작용된다.

    d.subset <- d %>% filter(variety == 'wt', root_dry_mass >= 50, shoot_dry_mass >= 120)
    # d.subset <- d %>% filter(variety == 'wt' & root_dry_mass >= 50 & shoot_dry_mass >= 120)
    head(d.subset)
    ## # A tibble: 4 x 7
    ##   replicate block root_dry_mass shoot_dry_mass trt   fert  variety
    ##       <dbl> <dbl>         <dbl>          <dbl> <chr> <chr> <chr>  
    ## 1         1     1            56            132 F10   F10   wt     
    ## 2         2     1            66            120 F10   F10   wt     
    ## 3         6     1            66            125 F10   F10   wt     
    ## 4         8     2            67            122 F10   F10   wt

     

    • wt 계통에서 "뿌리 부분 건조 중량이 50 이상" 또는 "지상부 건조 중량이 120 이상"의 조건을 만족하는 행을 추출하려면 아래와 같이 작성한다. 

    d.subset <- d %>% filter(variety == 'wt', root_dry_mass >= 50 | shoot_dry_mass >= 120)
    # d.subset <- d %>% filter(variety == 'wt' & (root_dry_mass >= 50 | shoot_dry_mass >= 120))
    head(d.subset)
    ## # A tibble: 6 x 7
    ##   replicate block root_dry_mass shoot_dry_mass trt   fert  variety
    ##       <dbl> <dbl>         <dbl>          <dbl> <chr> <chr> <chr>  
    ## 1         1     1            56            132 F10   F10   wt     
    ## 2         2     1            66            120 F10   F10   wt     
    ## 3         4     1            43            134 F10   F10   wt     
    ## 4         5     1            55            119 F10   F10   wt     
    ## 5         6     1            66            125 F10   F10   wt     
    ## 6         8     2            67            122 F10   F10   wt

     

    • 다른 예로서, 처리 군으로부터 F10 이외의 행을 추출 할 때는 아래와 같이 !를 입력하면 된다.

    # d.subset <- d %>% filter(!(fert == 'F10'))
    d.subset <- d %>% filter(fert != 'F10')
    head(d.subset)
    ## # A tibble: 6 x 7
    ##   replicate block root_dry_mass shoot_dry_mass trt   fert  variety
    ##       <dbl> <dbl>         <dbl>          <dbl> <chr> <chr> <chr>  
    ## 1         1     1            12             45 NH4Cl NH4Cl wt     
    ## 2         2     1            20             60 NH4Cl NH4Cl wt     
    ## 3         3     1            21             87 NH4Cl NH4Cl wt     
    ## 4         4     1            15             57 NH4Cl NH4Cl wt     
    ## 5         5     1             5             26 NH4Cl NH4Cl wt     
    ## 6         6     1            18             78 NH4Cl NH4Cl wt

     

    [dplyr::arrange 함수]

    • arrange함수는 주어진 조건에 따라 행을 정렬한다.

    • 데이터에 결측값인 NA가 포함 된 경우 arrange함수를 사용하여 정렬 할 때 오름차순 · 내림차순에 상관없이 결 측값 NA는 항상 데이터 세트의 하단에 정렬된다. 

    • 예를 들어, rice 데이터에 대한 근부 건조 중량을 기준으로 오름차순으로 정렬하려면 arrange 함수에 열 이름root_dry_mass을 지정하면 된다.

    d.subset <- d %>% arrange(root_dry_mass)
    head(d.subset)
    ## # A tibble: 6 x 7
    ##   replicate block root_dry_mass shoot_dry_mass trt           fert  variety
    ##       <dbl> <dbl>         <dbl>          <dbl> <chr>         <chr> <chr>  
    ## 1         7     2             1             35 NH4Cl +ANU843 NH4Cl ANU843 
    ## 2        10     2             3              5 F10 +ANU843   F10   ANU843 
    ## 3         2     1             4              6 F10 +ANU843   F10   ANU843 
    ## 4         3     1             4              3 F10 +ANU843   F10   ANU843 
    ## 5         1     1             4             22 NH4Cl +ANU843 NH4Cl ANU843 
    ## 6         5     1             5             26 NH4Cl         NH4Cl wt

     

    • 뿌리 부분 건조 중량을 기준으로 내림차순으로 정렬하려면 desc 함수를 이용하거나 열 이름에 -을 붙이면 된다.

    # d.subset <- d %>% arrange(-root_dry_mass)
    d.subset <- d %gt;% arrange(desc(root_dry_mass))
    head(d.subset)
    ## # A tibble: 6 x 7
    ##   replicate block root_dry_mass shoot_dry_mass trt   fert  variety
    ##       <dbl> <dbl>         <dbl>          <dbl> <chr> <chr> <chr>  
    ## 1         8     2            67            122 F10   F10   wt     
    ## 2         2     1            66            120 F10   F10   wt     
    ## 3         6     1            66            125 F10   F10   wt     
    ## 4         1     1            56            132 F10   F10   wt     
    ## 5         5     1            55            119 F10   F10   wt     
    ## 6        11     2            44             37 F10   F10   wt

     

    • 다음 뿌리 부분 건조 중량에 대하여 내림차순으로 지상부 건조 중량에 관해서는 오름차순으로 정렬되어 때 filter함수와 마찬가지로 여러 조건을 순서대로 주면된다. 

    • filter함수에 여러 조건을 대입하면 왼쪽의 조건이 우선된다.

    d.subset <- d %>% arrange(desc(root_dry_mass), shoot_dry_mass)
    head(d.subset)
    ## # A tibble: 6 x 7
    ##   replicate block root_dry_mass shoot_dry_mass trt   fert  variety
    ##       <dbl> <dbl>         <dbl>          <dbl> <chr> <chr> <chr>  
    ## 1         8     2            67            122 F10   F10   wt     
    ## 2         2     1            66            120 F10   F10   wt     
    ## 3         6     1            66            125 F10   F10   wt     
    ## 4         1     1            56            132 F10   F10   wt     
    ## 5         5     1            55            119 F10   F10   wt     
    ## 6        11     2            44             37 F10   F10   wt

     

    • 지금까지 소개 한 select함수, filter함수 및 arrange함수를 결합하여 데이터 세트를 유연하게 조작 할 수있다. 예를 들어 다음과 같은 작업도 쉽게 할 수있다

      • 계통이 wt 행을 추출하고

      • rice 데이터에서 처리 (fert), 뿌리 부분 건조 중량 (root_dry_mass) 지상부 건조 중량 (shoot_dry_mass)의 4 열을 추출하여

      • 단계 1-2에서 추출한 일부를 근부 건조 중량을 기준으로 내림차순으로 정렬

    • 이와 같은 작업을 수행하는 경우 아래와 같이 작성한다.

    wt.subset <- d %>%
                  filter(variety == 'wt') %>%
                  select(fert, root_dry_mass, shoot_dry_mass) %>%
                  arrange(desc(root_dry_mass))
    head(wt.subset)
    ## # A tibble: 6 x 3
    ##   fert  root_dry_mass shoot_dry_mass
    ##   <chr>         <dbl>          <dbl>
    ## 1 F10              67            122
    ## 2 F10              66            120
    ## 3 F10              66            125
    ## 4 F10              56            132
    ## 5 F10              55            119
    ## 6 F10              44             37

     

    [dplyr::group_by 함수]

    • group_by 함수는 주어진 조건에 따라 데이터를 여러 그룹으로 나눌 때 사용하는 함수이다. 

    • group_by 함수에서 처리 한 결과를 print도, group_by함수의 처리 전과 처리 후와는 외형적으로는 변하지 않는다. 

    • 그러나 group_by 함수에서 처리 한 후 데이터 세트에는 그룹 정보가 속성으로 저장된다. 

    • 예를 들어, rice 데이터 세트에 대해 각 계통별로 그룹화하는 경우 아래와 같이 작성한다.

    head(d)
    ## # A tibble: 6 x 7
    ##   replicate block root_dry_mass shoot_dry_mass trt   fert  variety
    ##       <dbl> <dbl>         <dbl>          <dbl> <chr> <chr> <chr>
    ## 1         1     1            56            132 F10   F10   wt     
    ## 2         2     1            66            120 F10   F10   wt     
    ## 3         3     1            40            108 F10   F10   wt     
    ## 4         4     1            43            134 F10   F10   wt     
    ## 5         5     1            55            119 F10   F10   wt     
    ## 6         6     1            66            125 F10   F10   wt
    
    
    d.grouped <- d %>% group_by(variety)
    head(d.grouped)
    ## # A tibble: 6 x 7
    ## # Groups:   variety [1]
    ##   replicate block root_dry_mass shoot_dry_mass trt   fert  variety
    ##       <dbl> <dbl>         <dbl>          <dbl> <chr> <chr> <chr>   
    ## 1         1     1            56            132 F10   F10   wt     
    ## 2         2     1            66            120 F10   F10   wt     
    ## 3         3     1            40            108 F10   F10   wt     
    ## 4         4     1            43            134 F10   F10   wt     
    ## 5         5     1            55            119 F10   F10   wt     
    ## 6         6     1            66            125 F10   F10   wt

     

    • group_by함수에서 추가 된 그룹 정보를 삭제하려면 ungroup 함수를 사용한다.

    d.grouped <- d %>% group_by(variety)
    d.ungrouped <- d.grouped %>% ungroup()

     

    [dplyr::summarise 함수]

    • summarise함수는 데이터의 집계하는 함수에서 group_by함수 등과 함께 사용되는 경우가 많다. 

    • 예를 들어, rice 데이터 세트에 대해 각 계통마다 뿌리 부분 건조 중량 및 지상부 건조 무게의 평균치를 구해하려면 먼저 variety 열을 기준으로 그룹화하고, 이어 근부 건조 중량 및 지상부 건조 무게 열에 집계 처리 (평균값 등의 계산)를 수행한다.

    d.massave <- d %>%
                    group_by(variety) %>%
                    summarise(root_dry_mass_ave = mean(root_dry_mass),
                              shoot_dry_mass_ave = mean(shoot_dry_mass))
    head(d.massave)
    ## # A tibble: 2 x 3
    ##   variety root_dry_mass_ave shoot_dry_mass_ave
    ##   <chr>               <dbl>              <dbl>
    ## 1 ANU843               9.67               41.8
    ## 2 wt                  26.5                77.3

     

    • 각 계통의 각 처리 군에 대해 평균을 구하는 경우는 group_by 거리에 조건을 쓴다.

    d.massave <- d %>%
                    group_by(variety, fert) %>%
                    summarise(root_dry_mass_ave = mean(root_dry_mass),
                              shoot_dry_mass_ave = mean(shoot_dry_mass))
    head(d.massave)
    ## # A tibble: 6 x 4
    ## # Groups:   variety [2]
    ##   variety fert   root_dry_mass_ave shoot_dry_mass_ave
    ##   <chr>   <chr>              <dbl>              <dbl>
    ## 1 ANU843  F10                 6                  7.33
    ## 2 ANU843  NH4Cl               9.17              46.6 
    ## 3 ANU843  NH4NO3             13.8               71.5 
    ## 4 wt      F10                49.5              108.  
    ## 5 wt      NH4Cl              12.6               50.2 
    ## 6 wt      NH4NO3             17.3               73.3

     

    • summarise에서 사용되는 mean함수는 R의 표준 함수이다. 따라서 결측치를 무시하고 평균 값을 구하려면 아래와 같이 쓰면 좋다.

    d.massave <- d %>%
                    group_by(variety, fert) %>%
                    summarise(root_dry_mass_ave = mean(root_dry_mass, na.rm = TRUE),
                              shoot_dry_mass_ave = mean(shoot_dry_mass, na.rm = TRUE))
    head(d.massave)
    ## # A tibble: 6 x 4
    ## # Groups:   variety [2]
    ##   variety fert   root_dry_mass_ave shoot_dry_mass_ave
    ##   <chr>   <chr>              <dbl>              <dbl>
    ## 1 ANU843  F10                 6                  7.33
    ## 2 ANU843  NH4Cl               9.17              46.6 
    ## 3 ANU843  NH4NO3             13.8               71.5 
    ## 4 wt      F10                49.5              108.  
    ## 5 wt      NH4Cl              12.6               50.2 
    ## 6 wt      NH4NO3             17.3               73.3

     

    • summarise중간에서 사용하는 함수를 직접 정의 할 수도 있다. 

    • 예를 들어, 사 분위 범위 (IQR)를 요구하는 함수 calc.IQR를 직접 정의하여 그것을 summarise 안에서 사용하는 경우에는 아래와 같이 작성한다.

    calc.IQR <- function(x) {
      q1 <- quantile(x, probs = 0.25)
      q3 <- quantile(x, probs = 0.75)
      iqr <- q3 - q1
      return(iqr)
    }
    
    d.massave <- d %>%
                    group_by(variety, fert) %>%
                    summarise(root_dry_mass_IQR = calc.IQR(root_dry_mass),
                              shoot_dry_mass_IQR = calc.IQR(shoot_dry_mass))
    head(d.massave)
    ## # A tibble: 6 x 4
    ## # Groups:   variety [2]
    ##   variety fert   root_dry_mass_IQR shoot_dry_mass_IQR
    ##   <chr>   <chr>              <dbl>              <dbl>
    ## 1 ANU843  F10                 2.25                4  
    ## 2 ANU843  NH4Cl               2.5                23.2
    ## 3 ANU843  NH4NO3              8                  25.8
    ## 4 wt      F10                17.8                17.2
    ## 5 wt      NH4Cl              11                  19.2
    ## 6 wt      NH4NO3              8                  24

     

    [dplyr::mutate 함수]

    • mutate함수는 기존 데이터에 새 열을 추가하고자 할 때 사용한다. 

    • 예를 들어, 근부 건조 중량 및 지상부 건조 중량의 합을 계산하여 그것을 dry_mass 열 이름에서 기존 데이터에 추가하고, 뿌리 부분 건조 중량이 건조 중량 전체의 비율을 root_dry_mass_ratio 열 이름에서 기존 데이터에 추가 하려면 아래와 같이 작성한다.

    d.new <- d %>% mutate(dry_mass = root_dry_mass + shoot_dry_mass,
                          root_dry_mass_ratio = root_dry_mass / dry_mass)
    head(d.new)
    ## # A tibble: 6 x 9
    ##   replicate block root_dry_mass shoot_dry_mass trt   fert  variety dry_mass
    ##       <dbl> <dbl>         <dbl>          <dbl> <chr> <chr> <chr>      <dbl>
    ## 1         1     1            56            132 F10   F10   wt           188
    ## 2         2     1            66            120 F10   F10   wt           186
    ## 3         3     1            40            108 F10   F10   wt           148
    ## 4         4     1            43            134 F10   F10   wt           177
    ## 5         5     1            55            119 F10   F10   wt           174
    ## 6         6     1            66            125 F10   F10   wt           191
    ## # … with 1 more variable: root_dry_mass_ratio <dbl>

     

    • 새로 만든 열 이름은 그대로 두고 새로운 데이터 원한다면 mutate함수 대신 transmute함수를 사용한다. 

    • 이렇게 하면 기존의 열 이름을 남길 수 있다.

    d.new <- d %>% transmute(variety,
                             dry_mass = root_dry_mass + shoot_dry_mass,
                             root_dry_mass_ratio = root_dry_mass / dry_mass)
    head(d.new)
    ## # A tibble: 6 x 3
    ##   variety dry_mass root_dry_mass_ratio
    ##   <chr>      <dbl>               <dbl>
    ## 1 wt           188               0.298
    ## 2 wt           186               0.355
    ## 3 wt           148               0.270
    ## 4 wt           177               0.243
    ## 5 wt           174               0.316
    ## 6 wt           191               0.346

     

     

     참고 문헌

    [논문]

    • 없음

    [보고서]

    • 없음

    [URL]

    • 없음

     

     문의사항

    [기상학/프로그래밍 언어]

    • sangho.lee.1990@gmail.com

    [해양학/천문학/빅데이터]

    • saimang0804@gmail.com

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    본 블로그는 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기