gpt4 book ai didi

使用 dcast reshape 数据?

转载 作者:行者123 更新时间:2023-12-02 04:55:12 28 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

df 中的变量y 应该被破坏,以便它的元素是新变量,每个都是虚拟编码。所有其他变量(在本例中只是 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 调用在其最基本的地方为数据帧的每一行的每个唯一值返回一个二进制指示变量,例如所以:

  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/

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