>source

% 점유율을 계산하고 mutate를 사용하여 새 열을 만들고 싶습니다. 다음과 같은 데이터가 있습니다 :

country, metric, segment, value1990, value2000, value2010
canada, abc, rural, 10, 15, 16
canada, abc, urban, 12, 12, 18
canada, abc, total, 22, 27, 34
canada, xyz, rural, 6, 9, 10
canada, xyc, urban, 7, 8, 8
canada, xyc, total, 13, 17, 18
canada, population, rural, 80, 86, 95
canada, population, urban, 102, 110, 121
canada, population, total, 182, 196, 216

데이터 프레임은 여러 국가 및 몇 년에 걸친 데이터로 구성됩니다. 다음 값으로 새 열을 만들고 싶습니다

country, metric, segment, value, percent1990, percent2000, percent2010
canada, abc, rural, 10, 15, 16, 12.5%, 17.4%, 16.8%
canada, abc, urban, 12, 12, 18, 11.7%, 10.9%, 14.8%
canada, abc, total, 22, 27, 34, 12.1%, 13.7%, 15.7%
canada, xyz, rural, 6, 9, 10, 7.5%, 10.4%, 10.5%
canada, xyc, urban, 7, 8, 8, 6.8%, 7.2%, 6.6%
canada, xyc, total, 13, 17, 18, 7.22%, 8.6%, 8.3%
canada, population, rural, 80, 86, 95, 100%, 100%, 100%
canada, population, urban, 102, 110, 121, 100%, 100%, 100%
canada, population, total, 182, 196, 216, 100%, 100%, 100%

필자는 본질적으로 여러 해에 걸쳐 농촌/도시/총계에 따라 인구의 가치 변수 비율을 계산하려고합니다.

예 : (1 행) percent_share = (10/80)*100 = 12.5%

(2 행) percent_share = (10/102)*100 = 11.76%

(행 3) percent_share = (10/182)*100 = 12.09%    

나는 group_by 를 넘어 갈 수 없어  필요한 기능을 입력하는 방법을 확인하기위한 체인 연결

df = df %>%
     group_by (country, metric) %>%
     mutate(...)


  • 답변 # 1

    수정 : 연도를 포함하는 새로운 질문 데이터

    연도와 총 인구를 새로운 열로 옮기면 더 쉬울 것입니다. 한 가지 방법이 있습니다.

    예제 데이터가 df1 라는 데이터 프레임에 있다고 가정 : 첫 번째 gather  몇 년.

    library(dplyr)
    library(tidyr)
    df1 <- df1 %>% gather(Year, Value, 4:6)
    
    
    그런 다음 metric 에 대한 필터  == population  원래 데이터에 다시 참여하십시오.

    df1 %>% filter(metric == "population") %>% 
      left_join(filter(df1, metric != "population"), 
                by = c("country", "segment", "Year")) %>% 
      select(country, segment, Year, population = Value.x, metric = metric.y, value = Value.y)
    
    

    결과 :

      country segment      Year population metric value
    1   canada   rural value1990         80    abc    10
    2   canada   rural value1990         80    xyz     6
    3   canada   urban value1990        102    abc    12
    4   canada   urban value1990        102    xyc     7
    5   canada   total value1990        182    abc    22
    6   canada   total value1990        182    xyc    13
    7   canada   rural value2000         86    abc    15
    8   canada   rural value2000         86    xyz     9
    9   canada   urban value2000        110    abc    12
    10  canada   urban value2000        110    xyc     8
    11  canada   total value2000        196    abc    27
    12  canada   total value2000        196    xyc    17
    13  canada   rural value2010         95    abc    16
    14  canada   rural value2010         95    xyz    10
    15  canada   urban value2010        121    abc    18
    16  canada   urban value2010        121    xyc     8
    17  canada   total value2010        216    abc    34
    18  canada   total value2010        216    xyc    18
    
    

    그런 다음 돌연변이를 추가하십시오 :

    df1 %>% filter(metric == "population") %>% 
      left_join(filter(df1, metric != "population"), 
                by = c("country", "segment", "Year")) %>% 
      select(country, segment, Year, population = Value.x, metric = metric.y, value = Value.y) %>% 
      mutate(percent_share = 100 * (value / population))
    
    

    결과 :

      country segment      Year population metric value percent_share
    1   canada   rural value1990         80    abc    10     12.500000
    2   canada   rural value1990         80    xyz     6      7.500000
    3   canada   urban value1990        102    abc    12     11.764706
    4   canada   urban value1990        102    xyc     7      6.862745
    5   canada   total value1990        182    abc    22     12.087912
    6   canada   total value1990        182    xyc    13      7.142857
    7   canada   rural value2000         86    abc    15     17.441860
    8   canada   rural value2000         86    xyz     9     10.465116
    9   canada   urban value2000        110    abc    12     10.909091
    10  canada   urban value2000        110    xyc     8      7.272727
    11  canada   total value2000        196    abc    27     13.775510
    12  canada   total value2000        196    xyc    17      8.673469
    13  canada   rural value2010         95    abc    16     16.842105
    14  canada   rural value2010         95    xyz    10     10.526316
    15  canada   urban value2010        121    abc    18     14.876033
    16  canada   urban value2010        121    xyc     8      6.611570
    17  canada   total value2010        216    abc    34     15.740741
    18  canada   total value2010        216    xyc    18      8.333333
    
    

  • 답변 # 2

    segment 를 기준으로 그룹화 할 수도 있습니다.   max(value 로 나눕니다. ), 인구 값이 가장 커야하기 때문에 :

    df %>% 
      group_by(country, segment) %>% 
      mutate(percent_share = value / max(value))
    # A tibble: 9 x 5
    # Groups:   segment [3]
      country metric     segment value percent_share
      <chr>   <chr>      <chr>   <dbl>         <dbl>
    1 canada  abc        rural      10        0.125 
    2 canada  abc        urban      12        0.118 
    3 canada  abc        total      22        0.121 
    4 canada  xyz        rural       6        0.075 
    5 canada  xyc        urban       7        0.0686
    6 canada  xyc        total      13        0.0714
    7 canada  population rural      80        1     
    8 canada  population urban     102        1     
    9 canada  population total     182        1
    
    

  • 이전 php - 문자열에서 # 태그를 추출하는 방법은 무엇입니까?
  • 다음 c++ - 파일 디스크립터를 사용하여 객체 이동