【问题标题】:set the name order in pivot_wider()在 pivot_wider() 中设置名称顺序
【发布时间】:2021-02-24 05:15:40
【问题描述】:

除了命名顺序更改外,我正在尝试执行与以下相同的操作。从here得到代码

  mtcars; rownames(mtcars) <- NULL
    df <- mtcars[,c(2,8,9)]
    head(df)
    (df 
      %>% pivot_longer(-cyl)       ## spread out variables (vs, am)
      %>% group_by(cyl,name)   
      %>% dplyr::mutate(n=n())            ## obs per cyl/var combo
      %>% group_by(cyl,name,value) 
      %>% dplyr::summarise(prop=n()/n)    ## proportion of 0/1 per cyl/var  
      %>% unique()                 ## not sure why I need this?
      %>% pivot_wider(id_cols=c(cyl,name),names_from=value,values_from=prop)
    )

     

预期答案

 cyl name     `0`    `1`

 4   vs    0.0909  0.909
 4   am    0.273   0.727
 6   vs    0.429   0.571
 6   am    0.571   0.429
 8   vs    1        NA 
 8   am    0.857   0.143

【问题讨论】:

    标签: r dataframe dplyr tidyr data-manipulation


    【解决方案1】:

    一种可能的解决方案是在代码下方添加三行。

    基本上,您将变量 name 修改为一个因子,其值按照 levels 中指定的顺序出现,以便在内部编码为 1、2、...
    然后你按照cyl分组,按照name排序

    (df 
      %>% pivot_longer(-cyl)       ## spread out variables (vs, am)
      %>% group_by(cyl,name)   
      %>% dplyr::mutate(n=n())            ## obs per cyl/var combo
      %>% group_by(cyl,name,value) 
      %>% dplyr::summarise(prop=n()/n)    ## proportion of 0/1 per cyl/var  
      %>% unique() ## not sure why I need this?
      %>% pivot_wider(id_cols=c(cyl,name),names_from=value,values_from=prop)
      %>% mutate(name = factor(name, levels = c("vs", "am")))
      %>% group_by(cyl)
      %>% arrange(name, .by_group = TRUE)
    )
    
    # A tibble: 6 x 4
    # Groups:   cyl [3]
        cyl name     `0`    `1`
      <dbl> <fct>  <dbl>  <dbl>
    1     4 vs    0.0909  0.909
    2     4 am    0.273   0.727
    3     6 vs    0.429   0.571
    4     6 am    0.571   0.429
    5     8 vs    1      NA    
    6     8 am    0.857   0.143
    

    【讨论】:

      【解决方案2】:

      不同的拍摄:

      df %>% pivot_longer(!cyl) %>% group_by(cyl, name, value) %>% mutate(cnt = n()) %>% 
      ungroup() %>% group_by(cyl, name) %>% mutate(prop = cnt/n()) %>% distinct() %>% 
      pivot_wider(id_cols = c(cyl, name), names_from = value, values_from = prop) %>% 
      arrange(cyl, desc(name))
      # A tibble: 6 x 4
      # Groups:   cyl, name [6]
          cyl name     `0`    `1`
        <dbl> <chr>  <dbl>  <dbl>
      1     4 vs    0.0909  0.909
      2     4 am    0.273   0.727
      3     6 vs    0.429   0.571
      4     6 am    0.571   0.429
      5     8 vs    1      NA    
      6     8 am    0.857   0.143
      > 
      

      【讨论】:

        猜你喜欢
        • 2020-01-30
        • 1970-01-01
        • 2022-01-14
        • 2021-08-01
        • 2020-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多