R:如何从两个不同的列中获取百分比变化
我试图用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
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))
oversum(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)