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 - 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
(另一个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
我正在处理一个长格式的数据集,如下所示。
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
(另一个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