【问题标题】:Reshaping database using reshape package-part 2 [duplicate]使用 reshape package-part 2 重塑数据库 [重复]
【发布时间】:2026-02-12 04:10:01
【问题描述】:

继上一篇文章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 值占一行,并附加不同的列。

你能给我一些建议吗?

【问题讨论】:

    标签: r dataframe reshape transpose


    【解决方案1】:

    dplyr/tidyr 的替代方法是首先将 gather 转换为长格式,group_by Idkey 并为每个组创建一个连续的行标识符 (new_key),最后是 @987654328 @它回到宽格式。

    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
    

    【讨论】:

      【解决方案2】:

      您可以从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)

      【讨论】: