r-如何折叠行以填充每列行数不均匀的组中的NA



我正在尝试格式化这些数据,以将其馈送到格式化表中。

样本数据:

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(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    

我试过这个和这个。

谢谢你的帮助。

我们可以通过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)

最新更新