将长格式重塑为宽格式,删除一些行

reshape long to wide format dropping some rows

我有 5 列数据框,我想将其中一些列从长格式转换为宽格式

我已经尝试过 reshap 和 tidyverse 并且可以接近但在转换时丢失了一些行。我有以下代码:

A<- c(30,   32, 32, 32, 35, 35, 35)
B<- c('x',  'y',    'y',    'y',    'z',    'z',    'z')
C<- c('g',  'g',    'g',    'g',    'g',    'g',    'g')
sp<-    c('cr', 'cr',   'cr',   'cr',   'au',   'au',   'au')
tl<-    c(29,   36, 44, 40, 48, 54, 53)
test<-data.frame(A,B,C,sp,tl)
test$A<-as.factor(test$A)

给出:

A   B   C   sp  tl
30  x   g   cr  29
32  y   g   cr  36
32  y   g   cr  44
32  y   g   cr  40
35  z   g   au  48
35  z   g   au  54
35  z   g   au  53

我愿意:

A   B   C   cr  au
30  x   g   29  
32  y   g   36  
32  y   g   44  
32  y   g   40  
35  z   g       48
35  z   g       54
35  z   g       53

我试过了

   wideT<-reshape(test, idvar = c("A","B","C"), timevar = "sp", direction 
= "wide")

接近但删除了一些行(可能是重复 A 的地方...

我希望在缺少值时用 NA 填充 cr 和 au,并按照上面的示例保留所有数据。谢谢

我们需要创建一个按 'A'、'B'、'C' 分组的序列列,然后在 [=13= 的 id.var 中也添加列名]

test$ind <- with(test, ave(seq_along(A), A, B, C, FUN = seq_along))
reshape(test, idvar = c("A","B","C", "ind"), timevar = "sp",
   direction  = "wide")[-4]
#    A B C tl.cr tl.au
#1 30 x g    29    NA
#2 32 y g    36    NA
#3 32 y g    44    NA
#4 32 y g    40    NA
#5 35 z g    NA    48
#6 35 z g    NA    54
#7 35 z g    NA    53

或者这可以通过 tidyverse

完成
library(tidyverse)
test %>%
    group_by(A, B, C) %>% 
    mutate(rn = row_number()) %>% 
    spread(sp, tl) %>%
    select(-rn)
# A tibble: 7 x 5
# Groups:   A, B, C [9]
#  A     B     C        au    cr
#  <fct> <fct> <fct> <dbl> <dbl>
#1 30    x     g        NA    29
#2 32    y     g        NA    36
#3 32    y     g        NA    44
#4 32    y     g        NA    40
#5 35    z     g        48    NA
#6 35    z     g        54    NA
#7 35    z     g        53    NA