我不确定这是否可行,但如果是的话,它会让生活变得更有效率.
更广泛的SO社区会感兴趣的一般问题:for循环(和apply函数等基本函数)适用于一般/一致操作,例如将X添加到数据框的每个列或行.我有一个我想要执行的一般/一致操作,但是对于数据帧的每个元素都有唯一的值.
有没有办法比每个分组的数据框子集更有效地执行此操作,应用具有相对于该分组的特定数字的函数,然后重新组合?我不在乎它是for循环还是应用,但是如果它使用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个子集?
最佳答案 似乎是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