将长格式重塑为宽格式,删除一些行
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
我有 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