Фильтрация данных, затем добавление скобок - PullRequest
0 голосов
/ 03 октября 2019

В настоящее время работает с набором данных о миллиардерах (небольшая сводка включена ниже);Я ищу их в трех возрастных категориях: «40 лет и младше», «от 41 до 65» и «старше 65 лет», а затем, что является наиболее распространенной категорией (их профессия) миллиардеров в каждом из трех возрастов? скобки.

Я пытался выделить данные вниз и изменить или разделить, чтобы создать скобки, но не уверен, что делать. Вычеркнутые строки - примеры того, что я пробовал.

load("bil.RData")
print(bil)

# A tibble: 2,614 x 22
     age category citizenship company.name company.type country_code founded
   <int> <chr>    <chr>       <chr>        <chr>        <chr>          <int>
 1    NA Financi… Saudi Arab… Rolaco Trad… new          SAU             1968
 2    34 Financi… United Sta… Fidelity In… new          USA             1946
 3    59 Non-Tra… Brazil      Companhia B… new          BRA             1948
 4    61 New Sec… Germany     Ratiopharm   new          DEU             1881
 5    NA Financi… Hong Kong   Swire        new          HKG             1816
 6    NA Traded … Bahrain     YBA Kanoo    new          BHR             1890
 7    NA New Sec… Japan       Otsuka Hold… new          JPN             1921
 8    NA Traded … Japan       Sony         new          JPN             1946
 9    66 Financi… Japan       Mori Buildi… new          JPN             1959
10    NA Traded … France      Chanel       new          FRA             1909
# … with 2,604 more rows, and 15 more variables: `from emerging` <chr>,
#   gdp <dbl>, gender <chr>, industry <chr>, inherited <chr>, name <chr>,
#   rank <int>, region <chr>, relationship <chr>, sector <chr>, `was
#   founder` <chr>, `was political` <chr>, wealth.type <chr>,
#   worth_billions <dbl>, year <int>
bil %>% 
    select(age, category) %>%
    arrange(age) %>%
    filter(!is.na(age), !is.na(category)) %>%
    group_by(age, category) %>%
    #mutate(n = sum(age)) %>%
    #separate(col =  age, c("Under 40", "41-65", "Above 65")) %>%
    print()
# A tibble: 2,158 x 2
# Groups:   age, category [312]
     age category          
   <int> <chr>             
 1    12 Financial         
 2    21 Financial         
 3    24 Financial         
 4    24 Financial         
 5    28 Non-Traded Sectors
 6    28 Resource Related  
 7    29 Financial         
 8    29 Traded Sectors    
 9    29 New Sectors       
10    29 New Sectors    

Предпочтительно, я ищу таблицу с тремя строками (по одной на категорию, под 40, 41-65, 65+) и тремя столбцами (age_bracket, наиболее распространенныйкатегория и н). Кроме того, дайте мне знать, как лучше всего включить наборы данных в stackoverflow, потому что этот набор немного велик для того, чтобы dput () был полезным (я думаю).

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Я думаю, что может быть много способов получить то, что хочешь.

Вот пример использования table1:

library(tidyverse)
library(table1)

bil1<-bil %>%
  mutate(age_group = cut(hp, 
      breaks = c(0, 40, 65, 110), 
      labels = c("< 40", "40 - 64", "65+")))
table1(~ category) | age_group, data = bil1)

Вы также можете попробовать множество других пакетов, таких как arsenal и stargazer

enter image description here

1 голос
/ 03 октября 2019

Чтобы разделить данные на разные сегменты, используйте findInterval или cut, а затем используйте top_n для возврата top category в каждом сегменте.

library(dplyr)
bil %>%
  filter(!is.na(age)) %>%
  group_by(group = findInterval(age, c(40, 65))) %>%
  count(category) %>%
  top_n(1, n)

Это просто вернет 1, 2, 3 в качестве ярлыков, если вы хотите назвать ярлыки, вы можете сделать

bil %>%
  filter(!is.na(age)) %>%
  group_by(group = c("40 and under", "41 to 65", "above 65")[
                   findInterval(age, c(40, 65)) + 1]) %>%
  count(category) %>%
  top_n(1, n)
...