【问题标题】:How can I pivot this tibble?我怎样才能转动这个小标题?
【发布时间】:2020-12-10 14:10:01
【问题描述】:

考虑到这个小标题

library(tibble)
mytab <- tribble(
  ~siren_ent, ~nbeta_dep01, ~nbeta_dep02, ~effeta_dep01, ~effeta_dep02, ~categ, 
  "A",   3,   0,   50,   0,   "X",
  "B",   0,   2,    0,  30,   "X",
  "C",   1,   1,  10,   15,   "Y"
)

我想旋转它以获得这个结果...

> result
# A tibble: 4 x 4
  DEP   categ nbeta effeta
  <chr> <chr> <dbl>  <dbl>
1 01    X         3     50
2 01    X         1     10
3 02    Y         2     30
4 02    Y         1     15

如果你有 tidyverse 的解决方案,我很感兴趣。

提前非常感谢!

【问题讨论】:

  • 有两列叫effeta_dep01,我假设一列应该是effeta_dep02?
  • 是的,抱歉,我编辑了

标签: r tidyverse


【解决方案1】:

我假设您的第二个effeta_dep01 列实际上应该称为effeta_dep02。如果是这样,那么这将提供接近所需输出的内容:

library(tidyr)
library(dplyr)

mytab %>%
  pivot_longer(nbeta_dep01:effeta_dep02,
               names_sep = "_dep",
               names_to = c(".value", "dep")) %>% 
  filter(nbeta > 0) %>% 
  select(-siren_ent)

给了

# A tibble: 4 x 4
  categ dep   nbeta effeta
  <chr> <chr> <dbl>  <dbl>
1 X     01        3     50
2 X     02        2     30
3 Y     01        1     10
4 Y     02        1     15

我假设您的预期输出不正确,但如果不是,我很高兴知道您期望的转换。

【讨论】:

    【解决方案2】:

    您的示例数据中有一个重复的列名,并且最终结果中没有出现几个零。通过结合两个枢轴和一个 group_by 我们可以达到预期的结果:

    library(tidyr)
    library(dplyr)
    library(readr)
    
    mytab %>% select(-siren_ent) %>% 
      pivot_longer(-categ) %>% 
      separate(name, '_', into = c('name','dep')) %>% 
      mutate(dep = parse_number(dep)) %>% 
      group_by(categ, dep, name) %>% 
      summarise(value = max(value)) %>% 
      pivot_wider(names_from = 'name', values_from = 'value')
    
    # A tibble: 4 x 4
    # Groups:   categ, dep [4]
      categ   dep effeta nbeta
      <chr> <dbl>  <dbl> <dbl>
    1 X         1     50     3
    2 X         2     30     2
    3 Y         1     10     1
    4 Y         2     15     1
    

    【讨论】:

      【解决方案3】:

      也试试这个:

      library(tidyverse)
      #Code
      new <- mytab %>% pivot_longer(-c(siren_ent,categ)) %>%
        separate(name,sep='_',c('var','index')) %>%
        select(-index) %>%
        group_by(siren_ent,categ,var) %>%
        mutate(id=row_number()) %>%
        pivot_wider(names_from = var,values_from=value) %>%
        ungroup() %>% select(-id) %>%
        filter(nbeta>0)
      

      输出:

      # A tibble: 4 x 4
        siren_ent categ nbeta effeta
        <chr>     <chr> <dbl>  <dbl>
      1 A         X         3     50
      2 B         X         2     30
      3 C         Y         1     10
      4 C         Y         1     15
      

      【讨论】:

        【解决方案4】:

        使用来自data.tablemelt

        library(data.table)
        melt(setDT(mytab)[, siren_ent := NULL], 
           id.var = 'categ', measure = patterns("^nbeta", "^effeta"), 
           value.name = c('nbeta', 'effeta'), variable.name = 'dep')[nbeta != 0]
        #   categ dep nbeta effeta
        #1:     X   1     3     50
        #2:     Y   1     1     10
        #3:     X   2     2     30
        #4:     Y   2     1     15
        

        【讨论】:

          猜你喜欢
          • 2022-01-12
          • 1970-01-01
          • 2016-06-15
          • 1970-01-01
          • 2013-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多