r将数据集从长到宽进行转换

r将数据集从长到宽进行转换,r,reshape,melt,R,Reshape,Melt,我正在处理一个长格式的数据集,如下所示 id Name FluidTotal 60718 Rocuronium 11.069175 07860 Rocuronium 5.967500 90389 Rocuronium 200.000000 01536 Rocuronium 78.311333 01536 Rocuronium

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

  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-110
Void
的单元格值是
110
,因为长格式的id
60718
的最后两行是
70
40
,所以当它们转换为宽格式时,这两个值相加

同样,宽格式id
01536
Rocuronium
值为
129.72693
,因为该id
01536
的长格式第4行和第5行分别为
78.311333
51.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
(另一个
基本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

本质上与这里相同——只需将
min
替换为
sum
即可,而不是-
restrape(聚合(FluidTotal~,data=dat,FUN=sum),idvar=“id”,timevar=“Name”,direction=“wide”)
或者,您可以使用
tidyr
包的
扩展
函数。
restrape(聚合(…)
对于一个新的R用户来说,这似乎是一个一次性成功和以后失败的处方。大多数有经验的R用户在
restrape
@42方面仍然存在问题-我真的不理解
restrape
的普遍问题。无论如何,
tapply
也是一个不错的解决方案,但它也会将
id
列丢失到
行。name
,这可能也会给初学者带来悲伤。也许你是唯一一个可以阅读
重塑
帮助页面并找出宽到长转换使用哪些参数以及长到宽转换使用哪些参数的人。我通常在第四次或第五次失败后放弃。不知道你是否看到了。不想在未确认的情况下默默删除。我将删除,因为它与主题无关。谢谢你。@42-,晚发邮件,还有戈帕拉,太好了。我将测试其他解决方案作为wellBy默认值?这实际上是
xtabs
的唯一选项。如果(NCOL(y)=1L){tapply(y,by,sum)}是的,这是唯一的选择,