gpt4 book ai didi

使用 dcast reshape 数据?

转载 作者:行者123 更新时间:2023-12-02 21:53:49 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com