【问题标题】:R: How to get the percentage change from two different columnsR:如何从两个不同的列中获取百分比变化
【发布时间】:2016-05-26 22:37:16
【问题描述】:

我正在尝试使用 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)) 超过 sum(LYSeats)):

1              AAL  BSB                 0.015385  
2              AAL  CNF                -0.053191

但我得到的是这个(它是每个月的平均每个操作)

1              AA     BSB                0.0270417328
2              AA     CNF               -0.0603483997

有没有办法用一个简单的行/命令来完成我所需要的?

谢谢!

【问题讨论】:

    标签: r aggregate dplyr


    【解决方案1】:

    我们可以使用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
    

    【讨论】:

    • 谢谢,我完全按照你的建议做了,但我只得到 PercentChange 1 -0.01966078
    • 没关系,我必须 detach(package:plyr) 才能完成这项工作。
    【解决方案2】:

    您还可以使用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
    

    【讨论】:

      【解决方案3】:

      简单快速的data.table 解决方案。

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

      【讨论】:

        【解决方案4】:

        可能值得注意的是,如果实际上是你所追求的百分比,你应该乘以 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
        

        【讨论】:

          【解决方案5】:
          df.new <- group_by(Carrier, Station) %>%
               mutate(Max = max(TYSeats, LYSeats),
               Min = min(TYSeats, LYSeats),
               Diff.per = Max/Min -1)
          

          你可以看到积极的百分比变化

          【讨论】:

            猜你喜欢
            • 2021-10-31
            • 1970-01-01
            • 2015-10-27
            • 2020-10-28
            • 1970-01-01
            • 2015-04-16
            • 2021-06-07
            • 2011-08-21
            • 1970-01-01
            相关资源
            最近更新 更多