使用dcast重塑数据? [英] Reshape data using dcast?

查看:8
本文介绍了使用dcast重塑数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不知道使用dcast()是否正确,但我想重塑以下数据。Frame:

df <- data.frame(x=c("p1","p1","p2"),y=c("a","b","a"),z=c(14,14,16))
df
   x y  z
1 p1 a 14
2 p1 b 14
3 p2 a 16

这样看起来就像这个:

df2 <- data.frame(x=c("p1","p2"),a=c(1,1),b=c(1,0),z=c(14,16))
   x a b  z
1 p1 1 1 14
2 p2 1 0 16
df中的变量y应该断开,以便其元素是新变量,每个变量都是虚拟编码的。所有其他变量(在本例中仅为z)对于每个人(p1、p2等)是相等的。特定人员p具有不同值的唯一变量是。
我希望这样做的原因是,我需要通过变量x将此数据集与其他数据集合并。问题是,它需要是每人一行(p1、p2等)。

推荐答案

这几乎是previous question的副本,我在那里使用的相同基本答案再次有效。也不需要任何外部包。

aggregate(model.matrix(~ y - 1, data=df),df[c("x","z")],max)

   x  z ya yb
1 p1 14  1  1
2 p2 16  1  0

为了解释这一点,因为它看起来有点奇怪,model.matrix在其最基本的调用中为数据的每行的每个唯一值返回一个二进制指示符变量。帧,如下所示:

  ya yb
1  1  0
2  0  1
3  1  0
如果通过两个id变量(和)得到中间结果,则实质上是对初始数据进行操作。
   x  z ya yb
1 p1 14  1  0
2 p1 14  0  1
3 p2 16  1  0

因此,如果在xz的每个组合中取yaybmax值,基本上可以这样做:

   x  z ya      yb
1 p1 14  1*max*  0
2 p1 14  0       1*max*

--collapse--

   x  z ya      yb
1 p1 14  1       1

...并对每个唯一的x/z组合重复此操作,以得出最终结果:

   x  z ya yb
1 p1 14  1  1
2 p2 16  1  0

将其概括为更多专栏有点疯狂,但它是可以做到的,感谢this question,例如:

df <- data.frame(x=c("p1","p1","p2"),y=c("a","b","a"),z=c("14","15","16"))
intm <- model.matrix(~ y + z - 1, data=df,
                 contrasts.arg = sapply(df[2:3], contrasts, contrasts=FALSE))
aggregate(intm,df[c("x")],max)

   x ya yb z14 z15 z16
1 p1  1  1   1   1   0
2 p2  1  0   0   0   1

这篇关于使用dcast重塑数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆