Group_by и мутировать по нескольким столбцам в R - PullRequest
0 голосов
/ 10 октября 2018

У меня есть датафрейм с названием страны, пола, 2013,2014,2014,2015 столбцов.

City           Gender  2013  2014  2015
Aberdeen       Female   30    40    50
Aberdeen       Male     20    15    16
Aberdeenshire  Female   60    80    70
Aberdeenshire  Male     50    40    15
.....Includes 425 records.

Я хочу выполнить соотношение женщин и мужчин (разделив женщин на мужчин для каждого города) для каждого городаТак вот как я пытался получить,

City           2013_ratio  2014_ratio  2015_ration
Aberdeen        1.5        2.66        2.5
Aberdeenshire   1.2        2           4.66

Может кто-нибудь помочь мне решить эту проблему.Я пробовал группировать по городам, но я не знаю, как это сделать, получая значения по строкам по полу.

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Вы можете более легко вычислить соотношение, если мужчина и женщина находятся в разных столбцах, и вы можете изменить структуру, используя tidyr

library(dplyr)
library(tidyr)

df %>% 
  gather(Year, Value, -City, - Gender) %>% 
  spread(Gender, Value) %>% 
  mutate(Ratio = Female/Male, Year = paste0(Year, "_Ratio")) %>% 
  select(-Female, -Male) %>% 
  spread(Year, Ratio)
0 голосов
/ 10 октября 2018

Код из предложенного Робом решения будет выглядеть следующим образом (с дополнительным шагом spread():

# data
df = data.frame(City = c("a", "a", "b", "b"),
                Gender = c("Female", "Male", "Female", "Male"),
                `2013` = c(30, 20, 60, 50),
                `2014` = c(40, 15, 80, 40),
                `2015` = c(50, 16, 70, 15))

# Actual process
library("dplyr")
library("tidyr")
df %>%
    # Transform wide table into tidy
    gather("Year", "Number", X2013:X2015) %>%
    # Reshape gender columns for easier summaries
    spread("Gender", "Number") %>%
    # Compute ratios
    group_by(City, Year) %>%
    summarise(ratio = Female/(Male + Female))
#> # A tibble: 6 x 3
#> # Groups:   City [?]
#>   City  Year  ratio
#>   <fct> <chr> <dbl>
#> 1 a     X2013 0.6  
#> 2 a     X2014 0.727
#> 3 a     X2015 0.758
#> 4 b     X2013 0.545
#> 5 b     X2014 0.667
#> 6 b     X2015 0.824

, созданным в 2018-10-10 пакетом представ (v0.2.1)

Чтобы получить именно ваш результат, вы можете применить обратно функцию spread(), чтобы распределить коэффициенты по годам, (spread(Year, ratio))

0 голосов
/ 10 октября 2018

С tidyverse:

 df = read.table(text="City           Gender  2013  2014  2015
 Aberdeen       Female   30    40    50
 Aberdeen       Male     20    15    16
 Aberdeenshire  Female   60    80    70
 Aberdeenshire  Male     50    40    15", header = T)
> library(tidyverse)
> 
> df %>%
   group_by(City) %>%
   arrange(City, Gender) %>%
   summarise_at(vars(X2013:X2015), .funs = funs(ratio = first(.)/last(.)))
# A tibble: 2 x 4
  City          X2013_ratio X2014_ratio X2015_ratio
  <fct>               <dbl>       <dbl>       <dbl>
1 Aberdeen              1.5        2.67        3.12
2 Aberdeenshire         1.2        2           4.67

или

df %>%
  group_by(City) %>%
  arrange(City,Gender) %>%
  summarise_at(vars(X2013:X2015), .funs = funs(ratio = .[Gender == "Female"]/.[Gender != "Female"]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...