我正在处理一个长格式的数据集,如下所示。
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
,因为长格式的标识60718
的最后两行是70
和40
所以当它们转换为宽格式时,会添加这两个值。
同样,广告格式为Rocuronium
的{{1}}的值为01536
,因为此ID为129.72693
的长格式的第4行和第5行为{{1} }和01536
我非常感谢您在完成此转换方面提供任何帮助,谢谢提前......
答案 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