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
,因为长格式的id60718
的最后两行是70
和40
,所以当它们转换为宽格式时,这两个值相加
同样,宽格式id01536
的Rocuronium
值为129.72693
,因为该id01536
的长格式第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)}是的,这是唯一的选择,