gpt4 book ai didi

R 示例 - ddply、ave 和合并

转载 作者:行者123 更新时间:2023-12-04 12:12:34 24 4
gpt4 key购买 nike

我写了一段代码。如果你们能建议更好的方法来做我想做的事情,那就太好了。 dt给出如下​​:

   SIC FYEAR AU       AT
1 1 2003 6 212.748
2 1 2003 5 3987.884
3 1 2003 4 100.835
4 1 2003 4 1706.719
5 1 2003 5 9.159
6 1 2003 7 60.069
7 1 2003 5 100.696
8 1 2003 4 113.865
9 1 2003 6 431.552
10 1 2003 7 309.109 ...

我的工作是为给定的 SIC 创建一个新列,FYEAR,具有最高 AT 百分比的 AU 以及最高 AT 和第二高 AT 之间的差值为 1,否则为 0。这是我的尝试做提到的事情。

a <- ddply(dt,.(SIC,FYEAR),function(x){ddply(x,.(AU),function(x) sum(x$AT))});

SIC FYEAR AU V1
1 1 2003 4 3412.619
2 1 2003 5 13626.241
3 1 2003 6 644.300
4 1 2003 7 1478.633
5 1 2003 9 0.003
6 1 2004 4 3976.242
7 1 2004 5 9383.516
8 1 2004 6 457.023
9 1 2004 7 456.167
10 1 2004 9 238.282

其中 V1 表示给定 SIC 和 FYEAR 的给定 AU 的所有行的总和 AT。接下来我做:

a$V1 <- ave(a$V1, a$SIC, a$FYEAR, FUN = function(x) x/sum(x));

SIC FYEAR AU V1
1 1 2003 4 1.780949e-01
2 1 2003 5 7.111150e-01
3 1 2003 6 3.362420e-02
4 1 2003 7 7.716568e-02
5 1 2003 9 1.565615e-07
6 1 2004 4 2.740114e-01
7 1 2004 5 6.466382e-01
8 1 2004 6 3.149444e-02
9 1 2004 7 3.143545e-02
10 1 2004 9 1.642052e-02

V1 列现在表示每个 AU 对给定 SIC 和 FYEAR 的 AT 贡献的百分比值。接下来,

a$V2 <- ave(a$V1, a$SIC, a$FYEAR, FUN = function(x) {t<-((sort(x, TRUE))[2]); 
ifelse((x-t)> 0.1,1,0)});

SIC FYEAR AU V1 V2
1 1 2003 4 1.780949e-01 0
2 1 2003 5 7.111150e-01 1
3 1 2003 6 3.362420e-02 0
4 1 2003 7 7.716568e-02 0
5 1 2003 9 1.565615e-07 0
6 1 2004 4 2.740114e-01 0
7 1 2004 5 6.466382e-01 1
8 1 2004 6 3.149444e-02 0
9 1 2004 7 3.143545e-02 0
10 1 2004 9 1.642052e-02 0

对于给定的 SIC,AU 和 FYEAR,其对 AT 的贡献百分比最高,并且 f 差异大于 10%,则 AU 获得 1,否则获得 0。

然后我将结果与原始数据 dt 合并。

dt <- merge(dt,a,key=c("SIC","FYEAR","AU"));

SIC FYEAR AU AT V1 V2
1 1 2003 4 1706.719 1.780949e-01 0
2 1 2003 4 100.835 1.780949e-01 0
3 1 2003 4 113.865 1.780949e-01 0
4 1 2003 4 1491.200 1.780949e-01 0
5 1 2003 5 3987.884 7.111150e-01 1
6 1 2003 5 100.696 7.111150e-01 1
7 1 2003 5 67.502 7.111150e-01 1
8 1 2003 5 9461.000 7.111150e-01 1
9 1 2003 5 9.159 7.111150e-01 1
10 1 2003 6 212.748 3.362420e-02 0

我做的很麻烦。有没有更好的方法来做同样的事情?谢谢。

最佳答案

我不确定删除的答案是否与此相同,但您可以在几行中有效地做到这一点。

# Simulate data
set.seed(1)
n<-1000
dt<-data.frame(SIC=sample(1:10,n,replace=TRUE),FYEAR=sample(2003:2007,n,replace=TRUE),
AU=sample(1:7,n,replace=TRUE),AT=abs(rnorm(n)))

# Cacluate proportion.
dt$prop<-ave(dt$AT,dt$SIC,dt$FYEAR,FUN=prop.table)
# Find AU with max proportion.
dt$au.with.max.prop<-
ave(dt,dt$SIC,dt$FYEAR,FUN=function(x)x$AU[x$prop==max(x$prop)])[,1]

全部在base中,避免了merge所以不会那么慢。

关于R 示例 - ddply、ave 和合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19892125/

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