我有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填充,并按照上面的示例保留所有数据。谢谢
答案 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