Вычислить процент этнической принадлежности в R

#r #dplyr

#r #dplyr

Вопрос:

Я анализирую набор данных о мужчинах из пакета Ecdat в R.

Я хотел бы вычислить процент каждой группы людей (чернокожих, испанцев и других), которые связаны с союзом.

Структура данных является:

 
 $str(Males)
 
 'data.frame':  4360 obs. of  12 variables:

 $ nr        : int  13 13 13 13 13 13 13 13 17 17 ...
 $ year      : int  1980 1981 1982 1983 1984 1985 1986 1987 1980 1981 ...
 $ school    : int  14 14 14 14 14 14 14 14 13 13 ...
 $ exper     : int  1 2 3 4 5 6 7 8 4 5 ...
 $ union     : Factor w/ 2 levels "no","yes": 1 2 1 1 1 1 1 1 1 1 ...
 $ ethn      : Factor w/ 3 levels "other","black",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ maried    : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
 $ health    : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
 $ wage      : num  1.2 1.85 1.34 1.43 1.57 ...
 $ industry  : Factor w/ 12 levels "Agricultural",..: 7 8 7 7 8 7 7 7 4 4 ...
 $ occupation: Factor w/ 9 levels "Professional, Technical_and_kindred",..: 9 9 9 9 5 2 2 2 2 2 ...
 $ residence : Factor w/ 4 levels "rural_area","north_east",..: 2 2 2 2 2 2 2 2 2 2 ...
  

Следующий код может выбрать 1980 год:

 Males %>% 
  filter(year == '1980') %>%
  select(union, ethn)
  
         union  ethn
1       no    other
9       no    other
17      no    other
25     yes    other
33     yes    hisp
41      no    hisp
49      no    other
57      no    other
65     yes    black
...    ...    ...
  

Конечный результат должен быть примерно таким:

 
Year: 1980:

union ethn    pct
no    other   0.25
no    black   0.25
no    hisp    ...
yes   other   ...
yes   black   ...
yes   hisp    ...

Year: 1981:

union ethn    pct
no    other   0.25
no    black   0.25
no    hisp    ...
yes   other   ...
yes   black   ...
yes   hisp    ...


....
  

Ответ №1:

Вы можете решить это с помощью group_by() и summarize() следующим образом:

 df %>%
  Males %>%
  filter(year == '1980') %>%
  select(union, ethn) %>%
  group_by(ethn) %>%
  summarize(yes = sum(union == 'yes')*100/n(),
            no = sum(union == 'no')*100/n())
  

Вот результат:

   # A tibble: 3 x 3
    ethn    yes    no
    <fct> <dbl> <dbl>
  1 other  22.2  77.8
  2 black  36.5  63.5
  3 hisp   30.6  69.4
  

Комментарии:

1. Спасибо за ваш ответ, я получил другой результат. Однако я могу проверить ваш код другим методом.

Ответ №2:

Тем временем я получил другой способ ответить на этот вопрос, используя функцию pct_routine.

   df1980 <- Males %>% 
    filter(year == '1980') %>%
    select(union, ethn) 

   pct.1980 <- pct_routine(df1980, ethn,union)
   pct.1980
  

Результат такой же, как предложил рудольфосвейга:

   # A tibble: 6 x 3
  # Groups:   ethn [3]
    ethn  union   pct
    <fct> <fct> <dbl>
  1 other no    0.778
  2 other yes   0.222
  3 black no    0.635
  4 black yes   0.365
  5 hisp  no    0.694
  6 hisp  yes   0.306