使用 dcast reshape 数据?

标签 r reshape reshape2

我不知道是否使用 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

变量ydf应该被破坏,以便它的元素是新的变量,每个虚拟编码。所有其他变量(在本例中只是 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 变量(xz)聚合该中间结果,那么您实际上是在对初始数据进行操作.框架:

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

因此,如果您在 x 的每个组合中取 yaybmax 值>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/

相关文章:

r - 如何使用 "cols()"和 "col_double"将逗号作为小数点

r - 从 r 中的列表中创建指示变量

r - ggplot2 和 reshape2

r - 从两个表的组合中查找最大值(for 循环太慢)

r - 捕获列模式频率

r - 覆盖 VennDiagram 包的总和值

r - 如何删除特定列中值为零的行?

java - 从 java netbeans 使用 Runtime.getRuntime().exec 时没有结果

r - R中的乘法常数

r - 一列的唯一值对应另一列的唯一值