我不知道是否使用 dcast()
是正确的方法,但我想 reshape 以下 data.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
变量y
在df
应该被破坏,以便它的元素是新的变量,每个虚拟编码。所有其他变量(在本例中只是 z
)对于每个人(p1,p2 等)都是相等的。特定人 p 具有不同值的唯一变量是 y
.
我想要这个的原因是因为我需要通过变量 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
调用为 data.frame 的每一行的每个唯一值返回一个二进制指示符变量,例如所以:
ya yb
1 1 0
2 0 1
3 1 0
如果您通过两个 id 变量(x
和 z
)聚合
该中间结果,那么您实际上是在对初始数据进行操作.框架:
x z ya yb
1 p1 14 1 0
2 p1 14 0 1
3 p2 16 1 0
因此,如果您在 x
和 的每个组合中取
,你基本上会这样做:ya
和 yb
的 max
值>z
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 reshape 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18113443/