Работа с уникальными значениями в масштабе (для циклов, применить или Plyr)
Я не уверен, возможно ли это, но если это так, то жизнь станет намного эффективнее.
Общая проблема, которая была бы интересна более широкому сообществу 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 подмножеств для каждой группы, когда у меня есть уникальные показатели и контрольные значения для каждой группы?
1 ответ
Кажется очевидным вариантом использования 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