【问题标题】:Pivot wider without list cols or excessive rows being created在不创建列表列或过多行的情况下更宽地旋转
【发布时间】:2020-11-11 22:09:49
【问题描述】:

我目前有一个长格式的字符串模式数据框(如下),但我需要宽格式。

df <- structure(list(lep = c("ef", "efe", "efef", "efefe", "efefef", 
                             "efefefe", "efefefef", "efefefefe", "efefefefef", "efefefefefef", 
                             "eg"), char_n = c(2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 12L, 2L
                             ), char_1 = c("e", "e", "e", "e", "e", "e", "e", "e", "e", "e", 
                                           "e")), row.names = c(NA, -11L), class = c("tbl_df", "tbl", "data.frame"
                                           ))
# A tibble: 11 x 3
   lep          char_n char_1
   <chr>         <int> <chr> 
 1 ef                2 e     
 2 efe               3 e     
 3 efef              4 e     
 4 efefe             5 e     
 5 efefef            6 e     
 6 efefefe           7 e     
 7 efefefef          8 e     
 8 efefefefe         9 e     
 9 efefefefef       10 e     
10 efefefefefef     12 e     
11 eg                2 e   

这是我想要的输出

# A tibble: 2 x 11
   char_1 x2    x3    x4    x5    x6     x7      x8       x9        x10        x12         
   <chr>  <chr> <chr> <chr> <chr> <chr>  <chr>   <chr>    <chr>     <chr>      <chr>       
 1 e      ef    efe   efef  efefe efefef efefefe efefefef efefefefe efefefefef efefefefefef        
 2 e      eg    NA    NA    NA    NA     NA      NA       NA        NA         NA   

但是使用以下我只能得到以下输出:

df %>%
mutate(row = row_number()) %>%
  pivot_wider(names_from = char_n, values_from=lep) %>% select(-row) %>%
  janitor::clean_names(.)
 
# A tibble: 11 x 11
   char_1 x2    x3    x4    x5    x6     x7      x8       x9        x10        x12         
   <chr>  <chr> <chr> <chr> <chr> <chr>  <chr>   <chr>    <chr>     <chr>      <chr>       
 1 e      ef    NA    NA    NA    NA     NA      NA       NA        NA         NA          
 2 e      NA    efe   NA    NA    NA     NA      NA       NA        NA         NA          
 3 e      NA    NA    efef  NA    NA     NA      NA       NA        NA         NA          
 4 e      NA    NA    NA    efefe NA     NA      NA       NA        NA         NA          
 5 e      NA    NA    NA    NA    efefef NA      NA       NA        NA         NA          
 6 e      NA    NA    NA    NA    NA     efefefe NA       NA        NA         NA          
 7 e      NA    NA    NA    NA    NA     NA      efefefef NA        NA         NA          
 8 e      NA    NA    NA    NA    NA     NA      NA       efefefefe NA         NA          
 9 e      NA    NA    NA    NA    NA     NA      NA       NA        efefefefef NA          
10 e      NA    NA    NA    NA    NA     NA      NA       NA        NA         efefefefefef
11 e      eg    NA    NA    NA    NA     NA      NA       NA        NA         NA    

我不确定是更改我更改为更广泛格式的方式还是之后的步骤应该不同?

任何帮助将不胜感激!

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    我们根据列'char_n'创建'rn',然后使用pivot_wider

    library(dplyr)
    library(tidyr)
    library(stringr)
    df %>%
        mutate(
               rn = cumsum(c(TRUE, diff(char_n) < 0)), char_n = str_c('x', char_n)) %>% 
        pivot_wider(names_from = char_n,  values_from = lep) %>%
        select(-rn)
    

    -输出

    # A tibble: 2 x 11
    #  char_1 x2    x3    x4    x5    x6     x7      x8       x9        x10        x12         
    #  <chr>  <chr> <chr> <chr> <chr> <chr>  <chr>   <chr>    <chr>     <chr>      <chr>       
    #1 e      ef    efe   efef  efefe efefef efefefe efefefef efefefefe efefefefef efefefefefef
    #2 e      eg    <NA>  <NA>  <NA>  <NA>   <NA>    <NA>     <NA>      <NA>       <NA>        
    

    【讨论】:

      【解决方案2】:

      在基础 R 中,您可以使用 reshape:

      reshape(transform(df, id = cumsum(c(0,diff(char_n)<0))), 
               dir='wide', idvar = c('char_1','id'), timevar = 'char_n')
      
         char_1 id lep.2 lep.3 lep.4 lep.5  lep.6   lep.7    lep.8     lep.9     lep.10       lep.12
      1       e  0    ef   efe  efef efefe efefef efefefe efefefef efefefefe efefefefef efefefefefef
      11      e  1    eg  <NA>  <NA>  <NA>   <NA>    <NA>     <NA>      <NA>       <NA>         <NA>
      

      【讨论】:

        猜你喜欢
        • 2014-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多