R:如何从两个不同的列中获取百分比变化

R:如何从两个不同的列中获取百分比变化,r,aggregate,dplyr,R,Aggregate,Dplyr,我试图用R解决这个问题,但我似乎找不到正确的解决方案 以下是我的数据的外观: Carrier Station Month TYSeats LYSeats AAL BSB 6 10560 10560 AAL BSB 7 10912 10912 AAL BSB 8 10560 9328 AAL BSB 9 9152 7392 AAL BSB 10 9328 9152 AAL BSB 11 8976 10384 AAL BSB 12 10208

我试图用R解决这个问题,但我似乎找不到正确的解决方案

以下是我的数据的外观:

Carrier Station Month   TYSeats LYSeats
AAL BSB 6   10560   10560
AAL BSB 7   10912   10912
AAL BSB 8   10560   9328
AAL BSB 9   9152    7392
AAL BSB 10  9328    9152
AAL BSB 11  8976    10384
AAL BSB 12  10208   10912
AAL CNF 6   12122   12644
AAL CNF 7   12958   13516
AAL CNF 8   10868   10138
AAL CNF 9   5434    5614
AAL CNF 10  5434    7630
AAL CNF 11  8987    9241
AAL CNF 12  12122   12958
我正在使用以下代码:

aggregate((TYSeats-LYSeats)/LYSeats~Carrier+Station,data=df,FUN=mean)
我所期望的解决方案是这样的(即(
sum(TYSeats)-sum(LYSeats))
over
sum(LYSeats)
):

但我得到的是这个(它是每个月平均每次手术)

有没有一种方法可以在一个简单的行/命令中完成我所需要的


谢谢

您也可以使用
plyr
软件包中的
ddply
功能:

library(plyr)
ddply(df, .(Carrier, Station), summarise, 
      PerentChange = (sum(TYSeats) - sum(LYSeats))/sum(LYSeats))

  Carrier Station PerentChange
1     AAL     BSB   0.01538462
2     AAL     CNF  -0.05319134

一个简单快速的
数据表
解决方案

library(data.table)

setDT(df)

df[ , .(PercentChange = sum(TYSEATs -LYSeats)/sum(LYSEATs)) , by =  .(Carrier, Station) ]

也许值得一提的是,如果你所追求的是这个百分比,你应该乘以100。使用@Psidom的代码:

ddply(df, .(Carrier, Station), summarise, 
  PerentChange = ((sum(TYSeats) - sum(LYSeats))/sum(LYSeats)*100))

  Carrier Station PerentChange
 AAL     BSB     1.538462
 AAL     CNF    -5.319134
例如,1/4是25%,但是

> 1/4
[1] 0.25

我们可以使用
dplyr

library(dplyr)
df1 %>% 
   group_by(Carrier, Station) %>% 
   summarise(PercentChange = (sum(TYSeats) - sum(LYSeats))/sum(LYSeats))
# Carrier Station PercentChange
#    <chr>   <chr>         <dbl>
#1     AAL     BSB    0.01538462
#2     AAL     CNF   -0.05319134
库(dplyr)
df1%>%
分组依据(承运人、车站)%>%
总结(百分比变化=(总和(TYSeats)-总和(LYSeats))/总和(LYSeats))
#载波站百分比变化
#                
#1 AAL BSB 0.01538462
#2 AAL CNF-0.05319134
df.new%
突变(最大值=最大值(TYSeats,LYSeats),
最小值=最小值(TYSEAT、LYSEAT),
每差=最大/最小值-1)

你可以看到积极的percantage变化

谢谢,我完全按照你的建议做了,但我只得到PercentChange 1-0.01966078。不过,我必须分离(软件包:plyr)才能工作。
> 1/4
[1] 0.25
library(dplyr)
df1 %>% 
   group_by(Carrier, Station) %>% 
   summarise(PercentChange = (sum(TYSeats) - sum(LYSeats))/sum(LYSeats))
# Carrier Station PercentChange
#    <chr>   <chr>         <dbl>
#1     AAL     BSB    0.01538462
#2     AAL     CNF   -0.05319134
df.new <- group_by(Carrier, Station) %>%
     mutate(Max = max(TYSeats, LYSeats),
     Min = min(TYSeats, LYSeats),
     Diff.per = Max/Min -1)