【问题标题】:How do I collapse rows to fill NAs in groups with uneven number of rows per column?如何折叠行以填充每列行数奇数的组中的 NA?
【发布时间】:2020-03-27 22:35:05
【问题描述】:

我正在尝试格式化这些数据以输入可格式化的表格。

样本数据:

test <- tibble(group = c("A", "B", "B", "B", "C", "D"), 
           name = c("Steve", "Mike", "Paul", "Jaimie", "John", "Marco"),
           year = c(1988, 2001, 2001, 2002, 1997, 2000))

给出:

# A tibble: 6 x 3
  group name    year
  <chr> <chr>  <dbl>
1 A     Steve   1988
2 B     Mike    2001
3 B     Paul    2001
4 B     Jaimie  2002
5 C     John    1997
6 D     Marco   2000

我希望格式化表有 groupyear 作为列,所以我传播:

test %>% 
  mutate(grouped_id = row_number()) %>%
  spread(key = year, value = name) 

给出:

# A tibble: 6 x 7
  group grouped_id `1988` `1997` `2000` `2001` `2002`
  <chr>      <int> <chr>  <chr>  <chr>  <chr>  <chr> 
1 A              1 Steve  NA     NA     NA     NA    
2 B              2 NA     NA     NA     Mike   NA    
3 B              3 NA     NA     NA     Paul   NA    
4 B              4 NA     NA     NA     NA     Jaimie
5 C              5 NA     John   NA     NA     NA    
6 D              6 NA     NA     Marco  NA     NA    

对于“B”组,我希望2002 列中的“Jaimie”折叠到“B”组的第一行,这样“B”组就没有三行。结果应如下所示:

# A tibble: 6 x 7
  group grouped_id `1988` `1997` `2000` `2001` `2002`
  <chr>      <int> <chr>  <chr>  <chr>  <chr>  <chr> 
1 A              1 Steve  NA     NA     NA     NA    
2 B              2 NA     NA     NA     Mike   Jaimie    
3 B              3 NA     NA     NA     Paul   NA    
4 C              5 NA     John   NA     NA     NA    
5 D              6 NA     NA     Marco  NA     NA    

我试过thisthis

感谢您的帮助。

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    我们可以通过row_number做一个群

    library(dplyr)
    library(tidyr)
    test %>%
       group_by(year) %>% 
       mutate(rn = row_number()) %>%
       ungroup %>%
       spread(year, name) %>%
       select(-rn)
    # A tibble: 5 x 6
    #  group `1988` `1997` `2000` `2001` `2002`
    #  <chr> <chr>  <chr>  <chr>  <chr>  <chr> 
    #1 A     Steve  <NA>   <NA>   <NA>   <NA>  
    #2 B     <NA>   <NA>   <NA>   Mike   Jaimie
    #3 B     <NA>   <NA>   <NA>   Paul   <NA>  
    #4 C     <NA>   John   <NA>   <NA>   <NA>  
    #5 D     <NA>   <NA>   Marco  <NA>   <NA>  
    

    在较新版本的tidyr中,最好使用pivot_wider

    test %>%
           group_by(year) %>% 
           mutate(rn = row_number()) %>%
           ungroup %>%
           pivot_wider(names_from = year, values_from = name) %>%
           select(-rn)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-21
      • 2020-04-19
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多