重塑从长到宽的格式,删除一些行

时间:2019-04-16 06:49:31

标签: r reshape

我有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重复的地方...

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

1 个答案:

答案 0 :(得分:1)

我们需要创建一个按'A','B','C'分组的序列列,然后在id.var的{​​{1}}中添加列名

reshape

或者这可以通过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