R:如何计算“增长”列,数据框中有多个变量

时间:2013-09-06 02:32:48

标签: r dataframe plyr

我正试图弄清楚每个季度增长最快的五个话题。我在R中有一个数据框(将其称为df),其中包含三列 - 四分之一数字(df $ QNum),主题(df $ Topic)以​​及该季度的主题记录数(df $ Total_Hits)。

以下是我的数据帧df外观的示例:

    Total_Hits          Topic                 QNum
        10              Technology            1
        86              Video Conferencing    1
        14              Video Conferencing    2
        10              Technology            3
         1              Video Conferencing    1
        12              Technology            21

我想在df,df $ QonQGrowth中创建一个新列,对于每条记录,计算上一季度该主题上的点击量增长。我不介意它如何查找df $ QNum = 1但是对于本例中的第三条记录,它会计算:  (Total_Hits /(Total_Hits,其中Topic =“视频会议”和QNum = 1)-1)

我认为它看起来像下面这样但是无法弄清楚:

df$QonQGrowth <- (df$Total_Hits / ([a lookup of Total_Hits for df$Topic and (df$Qnum-1)?]))-1

数据集非常大,因此每个季度都不会有每个主题的记录。

类似的问题herehere,但它们并没有完全符合我的需要。

编辑:This question似乎也可能有用,使用ddply或聚合。

提前非常感谢!

1 个答案:

答案 0 :(得分:4)

我确信有更简洁的方法可以做到这一点,但这是一个丑陋的plyr解决方案:

> #make junk data
> set.seed(3)
> dat <- data.frame(total_hits=round(runif(25,0,50)),topic=sample(c("A","B","C","D"),25,T),qnum=round(runif(25,1,6)))
> dat <- dat[row.names(unique(dat[,2:3])),]
> dat
   total_hits topic qnum
1           8     D    2
2          40     C    2
3          19     D    5
4          16     C    6
6          30     B    6
7           6     B    3
8          15     A    2
9          29     B    2
11         26     B    5
12         25     D    1
13         27     A    5
18         35     A    4
19         45     C    3
20         14     B    1
23          6     A    6
25         12     D    4
> 
> #get you qonqgrowth variable
> library(plyr)
> ddply(dat,.(topic,qnum),summarize,qonqgrowth=ifelse(any(dat$qnum==qnum-1 & dat$topic == topic),total_hits/(dat$total_hits[dat$qnum == qnum-1 & dat$topic == topic]),NA))
   topic qnum qonqgrowth
1      A    2         NA
2      A    4         NA
3      A    5  0.7714286
4      A    6  0.2222222
5      B    1         NA
6      B    2  2.0714286
7      B    3  0.2068966
8      B    5         NA
9      B    6  1.1538462
10     C    2         NA
11     C    3  1.1250000
12     C    6         NA
13     D    1         NA
14     D    2  0.3200000
15     D    4         NA
16     D    5  1.5833333