Как свернуть строки, чтобы заполнить NA в группах с разным количеством строк в столбце? - PullRequest
1 голос
/ 28 марта 2020

Я пытаюсь отформатировать эти данные для подачи в форматируемую таблицу.

Пример данных:

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

Я хочу, чтобы форматируемая таблица имела group и year в качестве столбцов, поэтому я распространяю по :

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" я хочу, чтобы "Jaim ie" в столбце 2002 свернулось до первого ряда группы " 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    

Я пробовал это и это .

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 28 марта 2020

Мы можем сделать группу по 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)
...