gpt4 book ai didi

与一个级别相比, reshape Actor 阵容

转载 作者:行者123 更新时间:2023-12-04 11:06:21 27 4
gpt4 key购买 nike

我经常有数据,我想将一个变量级别的值与所有其他级别变量的值进行比较。每次我编写代码来做到这一点时,我都希望它更容易。下面是问题的一个例子:

假设我想比较任何切工钻石的平均成本与最佳切工钻石的平均成本。为了公平起见,我想针对每个清晰度分别执行此操作。

让我们检查一下我们有足够的数据:

> with(diamonds,table(cut,clarity))
clarity
cut I1 SI2 SI1 VS2 VS1 VVS2 VVS1 IF
Fair 210 466 408 261 170 69 17 9
Good 96 1081 1560 978 648 286 186 71
Very Good 84 2100 3240 2591 1775 1235 789 268
Premium 205 2949 3575 3357 1989 870 616 230
Ideal 146 2598 4282 5071 3589 2606 2047 1212

好吧,Idea 中没有零,所以让我们计算平均值。
> claritycut<-ddply(diamonds,.(clarity,cut),summarize,price=mean(price))
> claritycut
clarity cut price
1 I1 Fair 3703.533
2 I1 Good 3596.635
3 I1 Very Good 4078.226
4 I1 Premium 3947.332
5 I1 Ideal 4335.726
6 SI2 Fair 5173.916
7 SI2 Good 4580.261
8 SI2 Very Good 4988.688
9 SI2 Premium 5545.937
10 SI2 Ideal 4755.953
...

我想要的最终结果是:
   clarity  variable     ratio
1 I1 Fair 0.8541899
2 I1 Good 0.8295348
3 I1 Very Good 0.9406098
4 I1 Premium 0.9104200
5 I1 Ideal 1.0000000
6 SI2 Fair 1.0878822
7 SI2 Good 0.9630586
8 SI2 Very Good 1.0489356
9 SI2 Premium 1.1661043
10 SI2 Ideal 1.0000000
...

但我不确定如何巧妙地做到这一点。这个问题的其余大部分都涉及计算中的一个中间步骤——除法。

现在我想计算所有削减与理想的相对价格。这是我希望在计算过程中看到的数据框 - 仅提取一级切割:
> claritycutideal <- join(subset(claritycut,cut!="Ideal"),summarize(subset(claritycut,cut=="Ideal"),Ideal=price,clarity))
> print(claritycutideal)
Joining by: clarity
clarity cut price Ideal
1 I1 Fair 3703.533 4335.726
2 I1 Good 3596.635 4335.726
3 I1 Very Good 4078.226 4335.726
4 I1 Premium 3947.332 4335.726
5 SI2 Fair 5173.916 4755.953
6 SI2 Good 4580.261 4755.953
7 SI2 Very Good 4988.688 4755.953
8 SI2 Premium 5545.937 4755.953
...

哪个有效,但写上面的语句很繁琐,我仍然需要完成计算,再次提到理想的名字。
> mutate(claritycutideal,ratio=price/Ideal)

感觉就像我想要的东西
> cast(claritycut,clarity~cut)
Using clarity, cut as id variables
clarity Fair Good Very Good Premium Ideal
1 I1 3703.533 3596.635 4078.226 3947.332 4335.726
2 SI2 5173.916 4580.261 4988.688 5545.937 4755.953
3 SI1 4208.279 3689.533 3932.391 4455.269 3752.118
4 VS2 4174.724 4262.236 4215.760 4550.331 3284.550
...

这完全不适合平均计算,因为我需要知道计算中所有重铸级别的名称:

我想重铸,但有一种方法可以过滤提取的级别并使其余的保持不变,例如:
> cast(claritycut,clarity~cut,subset=cut=="Ideal")

存在,但不保留未过滤的级别。

然后我需要再次熔化它,虽然有重铸,但没有重熔。

有没有人有一个巧妙的技巧来做到这一点?

或者,也许我完全以错误的方式看待这个问题 - 边际计算会为我做这个吗?

以下工作完全正确,但很繁琐:
> valuevars=function(x)x[!names(x)%in%attr(x,"idvars")]
> melt(ddply(cast(claritycut,clarity~cut),.(clarity),
function(x)valuevars(x)/x$Ideal))

最佳答案

我不确定这是否足够整洁,但有两个衬里:

# from your code
claritycut <- ddply(diamonds,.(clarity,cut),summarize,price=mean(price))

# 1 do that work
transform(merge(claritycut, subset(claritycut, cut=="Ideal"), by="clarity"),
ratio = price.x / price.y)

# 2 another way
ddply(claritycut, .(clarity),
function(x) data.frame(cut=x$cut,
rate=x$price / subset(x, cut == "Ideal")$price))

# 3 another way
ddply(claritycut, .(clarity),
summarize, cut=cut, rate=price / price[cut == "Ideal"])

最后 4) 这是一个单行版本:
ddply(diamonds, .(clarity), 
function(x) transform(ddply(x, .(cut),
summarize, rate=mean(price)),
rate=rate/mean(subset(x, cut=="Ideal")$price)))

但太复杂了。

关于与一个级别相比, reshape Actor 阵容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6771202/

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