使用重塑包重塑数据库 - 第 2 部分

Reshaping database using reshape package-part 2

根据之前的互动 post 我创建这个是为了问其他问题。 简而言之:我有一个数据库,其中有一些行是为 Id 列复制的,我想转置它。下面的 cose 显示了我的数据库的一个小例子。

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 值一行,并附有不同的列。

你能给我一些建议吗?

您可以使用 data.table 中的 dcast。此函数允许传播多个值变量。

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)

A 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