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