r将数据集从长到宽变换

时间:2016-04-08 01:13:43

标签: r reshape melt

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

  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,因为长格式的标识60718的最后两行是7040所以当它们转换为宽格式时,会添加这两个值。

同样,广告格式为Rocuronium的{​​{1}}的值为01536,因为此ID为129.72693的长格式的第4行和第5行为{{1} }和01536

我非常感谢您在完成此转换方面提供任何帮助,谢谢提前......

2 个答案:

答案 0 :(得分:5)

基本功能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来强制它。

答案 1 :(得分:2)

我们可以使用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