【问题标题】:R: How to calculate a "Growth" column, with multiple variables in dataframeR:如何计算“增长”列,数据框中有多个变量
【发布时间】:2013-09-06 02:32:48
【问题描述】:

我试图找出每个季度增长最快的五个主题。我在 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, where Topic="Video Conferencing" and 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 或聚合。

提前非常感谢!

【问题讨论】:

    标签: r dataframe plyr


    【解决方案1】:

    我确信有一种更简洁的方法可以做到这一点,但这是一个丑陋的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
    

    【讨论】:

    • 可能很复杂,但也不是那么难看:-)。
    • 正是我想要的,非常感谢!不幸的是,它不适用于我的数据集,因为它太大了 :( 但很高兴了解如何使用 ddply。
    • 你的意思是它不起作用?您是否收到错误消息?是不是太慢了?如果您有多个内核和足够的内存,您可以轻松地并行运行任何 ddply,但 data.table 解决方案可能是更好的选择。
    • @David 它看起来太慢了——我已经让它运行了几个小时没有结果。感谢您的建议!有点离题 - 但我已将 .parallel=TRUE 添加到 ddply() 的末尾,我收到“错误:并行 plyr 操作所需的 foreach 包”
    • 这说明你需要安装foreach 包才能并行运行ddply(),运行:install.packages('foreach')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多