在上一篇文章Reshaping database using reshape package之后,我进行了互动,以提出其他问题。 简要地说:我有一个数据库,其中包含一些要为ID列复制的行,我想对其进行转置。下面的例子展示了我的数据库的一个小例子。
test<-data.frame(Id=c(1,1,2,3),
St=c(20,80,80,20),
gap=seq(0.02,0.08,by=0.02),
gip=c(0.23,0.60,0.86,2.09),
gat=c(0.0107,0.989,0.337,0.663))
我想要一个最终的数据库,如我所附的图:
每个ID值一行,并附上不同的列。
你能给我什么建议吗?
答案 0 :(得分:3)
您可以使用dcast
中的data.table
。此功能允许分布多个值变量。
library(data.table)
setDT(test) # convert test to a data.table
test1 <- dcast(test, Id ~ rowid(Id),
value.var = c('St', 'gap', 'gip', 'gat'), fill = 0)
test1
# Id St_1 St_2 gap_1 gap_2 gip_1 gip_2 gat_1 gat_2
#1: 1 20 80 0.02 0.04 0.23 0.6 0.0107 0.989
#2: 2 80 0 0.06 0.00 0.86 0.0 0.3370 0.000
#3: 3 20 0 0.08 0.00 2.09 0.0 0.6630 0.000
如果您想在结束时继续data.frame
致电setDF(test1)
。
答案 1 :(得分:0)
一种dplyr
/ tidyr
的替代方法是首先将gather
转换为长格式group_by
Id
和key
并创建顺序行标识符每个组(new_key
),最后spread
返回到较宽的形式。
library(dplyr)
library(tidyr)
test %>%
gather(key, value, -Id) %>%
group_by(Id, key) %>%
mutate(new_key = paste0(key, row_number())) %>%
ungroup() %>%
select(-key) %>%
spread(new_key, value, fill = 0)
# Id gap1 gap2 gat1 gat2 gip1 gip2 St1 St2
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 0.02 0.04 0.0107 0.989 0.23 0.6 20 80
#2 2 0.06 0 0.337 0 0.86 0 80 0
#3 3 0.08 0 0.663 0 2.09 0 20 0