使用reshape软件包重塑数据库第2部分

时间:2019-06-01 10:07:05

标签: r dataframe reshape transpose

在上一篇文章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))

我想要一个最终的数据库,如我所附的图:

enter image description here

每个ID值一行,并附上不同的列。

你能给我什么建议吗?

2 个答案:

答案 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 Idkey并创建顺序行标识符每个组(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