大规模使用唯一值(for循环,应用或plyr)

时间:2014-03-01 15:46:19

标签: r for-loop plyr apply dplyr

我不确定这是否可能,但如果确实如此,它会让生活变得更有效率。

更广泛的SO社区会感兴趣的一般问题:for循环(和apply函数等基本函数)适用于一般/一致操作,例如将X添加到数据框的每个列或行。我有一个我想要执行的一般/一致操作,但是对于数据帧的每个元素都有唯一值。

有没有办法比每个分组的数据框子集更有效地执行此操作,应用具有相对于该分组的特定数字的函数,然后重新组合?我不在乎它是 for循环还是 apply ,但如果它使用 plyr 功能,则可以获得奖励积分。


这是我正在处理的更具体的问题:我已经得到了以下数据。最终我想要的是具有日期的时间序列的数据框,每列代表一个区域与某些基准的关系。

问题:每个地区的利益衡量标准是不同的,基准也是如此。这是数据:

library(dplyr)
library(reshape2)

data <- data.frame(
    region = sample(c("northeast","midwest","west"), 100, replace = TRUE),
    date = rep(seq(as.Date("2010-02-01"), length=10, by = "1 day"),10),
    population = sample(50000:100000, 10, replace = T),
    skiers = sample(1:100),
    bearsfans = sample(1:100),
    dudes = sample(1:100)
)

和我正在处理的摘要框架:

data2 <- data %.%
    group_by(date, region) %.%
    summarise(skiers = sum(skiers), 
            bearsfans= sum(bearsfans), 
            dudes = sum(dudes), 
            population = sum(population)) %.%
    mutate(ppl_per_skier = population/skiers,
            ppl_per_bearsfan = population/bearsfans,
            ppl_per_dude = population/dudes) %.%
    select(date, region, ppl_per_skier, ppl_per_bearsfan , ppl_per_dude)

这是棘手的部分:

  • 对于东北,我只关心“ppl_per_skier”,基准是3500
  • 对于中西部,我只关心“ppl_per_bearsfan”,基准是1200
  • 对于西方,我只关心“ppl_per_dude”,基准是5000

我提出解决这个问题的任何方法都涉及为每个度量创建子集,但是通过数百个度量和不同的基准来大规模地实现这一点并不理想。例如:

midwest <- data2 %.% 
            filter(region == "midwest") %.%
            select(date, region, ppl_per_bearsfan) %.%
            mutate(bmark = 1200, against_bmk = bmark/ppl_per_bearsfan-1) %.%
            select(date, against_bmk)

同样对于每个地区,其各自的衡量标准及其各自的基准,然后按日期将它们重新组合在一起。最终,我想要这样的事情,每个地区的特定基准和衡量指标的表现都是按日期排列的(当然这是假数据):

        date midwest_againstbmk northeast_againstbmk west_againstbmk
1 2010-02-10          0.9617402            0.6008032       0.3403260
2 2010-02-11          0.5808621            0.5119942       0.7787559
3 2010-02-12          0.4828346            0.6560053       0.3747920
4 2010-02-13          0.6499841            0.7567194       0.8387461
5 2010-02-14          0.6367520            0.4564254       0.7269161

当我为每个组提供独特的度量和基准值时,是否有办法获得这种数据和结构而不必为每个分组执行X个子集?

1 个答案:

答案 0 :(得分:2)

似乎是mapply的一个明显用例:

> mapply(function(d,y,b) {(b/d[,y])-1},
         split(data2,data2$region), 
         c('ppl_per_bearsfan','ppl_per_skier','ppl_per_dude'), 
         c(1200,3500,5000))
          midwest   northeast      west
 [1,] -0.26625428 -0.02752186 3.5881957
 [2,]  0.48715638  1.89169295 2.6928546
 [3,] -0.94222992  1.26065537 4.0388343
 [4,] -0.38116663  0.79572184 1.4118364
 [5,] -0.05937874  2.05459482 1.8822015
 [6,] -0.41463925  1.60668461 1.5914408
 [7,] -0.31211391  1.21093777 2.7517886
 [8,] -0.88923466  0.44917981 1.2251965
 [9,] -0.02781965 -0.24637182 2.7143103
[10,] -0.46643682  1.28944776 0.6246315