r 将数据集从长到宽

r transform dataset from long to wide

我正在处理一个长格式的数据集,如下所示。

  id      Name                 FluidTotal
  60718   Rocuronium           11.069175
  07860   Rocuronium           5.967500
  90389   Rocuronium           200.000000
  01536   Rocuronium           78.311333 
  01536   Rocuronium           51.415600 
  28047   Rocuronium           72.944444
  28047   Acid                 1
  28047   Acid                 1
  28047   Acid                 1
  28047   Acid                 1
  92323   Acid                 1
  92323   Void                 100
  01536   Void                 25
  60718   Void                 70
  60718   Void                 40  

我想做的是将其转换为如下所示的宽幅格式

   Id      Rocuronium   Acid    Void
   60718   11.069175    -       110 
   07860   5.967500     -       -                                         
   90389   200.000000   -       -
   01536   129.72693    -       25
   28047   72.944444    4       -
   92323   -            1       100 

第一行是 60718 11.069175 - 110Void 的单元格值是 110 因为长格式中 id 60718 的最后两行是 7040 所以当它们转换为宽格式时,这两个值会相加。

同样,id 01536 的宽格式 Rocuronium 的值是 129.72693 因为此 id 01536 的长格式的第 4 行和第 5 行是 78.31133351.415600

对于完成此转换的任何帮助,我将不胜感激,在此先感谢..

基本功能 tapply 功能可让您在交叉分类类别中进行操作:

with( dat, tapply( FluidTotal, list(id,Name), sum))

      Acid Rocuronium Void
1536    NA  129.72693   25
7860    NA    5.96750   NA
28047    4   72.94444   NA
60718   NA   11.06917  110
90389   NA  200.00000   NA
92323    1         NA  100

在描述转换时,折叠单个行的行为不同于仅仅从长到宽。可能应该注意的是,这会重新生成一个 R 矩阵对象,如果它需要采用数据帧的形式,您可以使用 data.frame 来强制它。

我们可以使用xtabs(另一个base R函数)。默认情况下,xtabs 聚合 sum.

xtabs(FluidTotal~., df1)
#         Name
#id          Acid Rocuronium      Void
# 1536    0.00000  129.72693  25.00000
# 7860    0.00000    5.96750   0.00000
# 28047   4.00000   72.94444   0.00000
# 60718   0.00000   11.06917 110.00000
# 90389   0.00000  200.00000   0.00000
# 92323   1.00000    0.00000 100.00000