【问题标题】:Group_by and mutate by multiple columns in RGroup_by 和 R 中的多列变异
【发布时间】:2018-10-10 11:19:10
【问题描述】:

我有包含国家、性别、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

谁能帮我解决这个问题。我曾尝试按城市分组,但我不知道如何通过按性别的行获取价值。

【问题讨论】:

  • 使用gather()将DF转换为长DF。然后你可以 group_by(City, Year) 并计算比率。

标签: r group-by dplyr


【解决方案1】:

如果男性和女性在不同的列中,您可以更轻松地计算比例,您可以使用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)

【讨论】:

    【解决方案2】:

    Rob 建议的解决方案中的代码是(带有额外的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
    

    reprex package (v0.2.1) 于 2018 年 10 月 10 日创建

    要准确获得您的结果,您可以应用函数 spread() 将比率分布在多年内,(spread(Year, ratio))

    【讨论】:

    • 谢谢它给了我确切的答案。我终于用这个命令获得了 2013 年的最低配给。 female_ratio % spread("Year","ratio")
    【解决方案3】:

    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"]))
    

    【讨论】:

    • 非常感谢!!!是否有可能得到哪个城市的比率变化最大,哪个城市变化最小?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2020-01-19
    • 1970-01-01
    • 2023-01-19
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多