Как сделать перемещение MAX на основе какого-либо правила во фрейме данных? - PullRequest
2 голосов
/ 18 января 2011
> days=Sys.Date()-1:70
> price=abs(rnorm(70))
> regular=rep(c(0,0,0,0,1,0,1,0,0,1),c(7,7,7,7,7,7,7,7,7,7))
> y=data.frame(cbind(days,price,regular))

у как
дней цена обычная
1 14990 0,16149463 0
2 14989 1,69519358 0
3 14988 1,5721998 0
4 14987 0,47614311 0
5 14986 0,87016180 0
6 14985 2,55679229 0
7 14984 0,89753533 0

вывод, который я хочу: добавьте к y другой столбец, значение которого является максимальной ценой за последние 2 регулярных недели. Так что, если текущая строка сегодня, то получите максимальную цену за последние 14 дней (включая сегодня), если последние 2 недели являются обычными неделями, если одна из последних 2 недель не является обычной неделей, то мне нужно вернуться дальше, чтобы найти максимум цена, так как мне нужна максимальная цена за последние 2 обычной недели. Как я могу это сделать? Или я должен использовать цикл /, если это сделать?

Кстати, почему дни такие, как 14990, 4989, после cbind (дни, цены, обычные)? до cbind дни похожи формат "2010-12-23".

1 Ответ

2 голосов
/ 18 января 2011

Предполагая, что день регулярный, если регулярный == 1, для каждой строки i мы рассматриваем строки от 1 до i, удаляем нерегулярные строки и возвращаем NA, если строк не осталось, или возвращаем наибольшую из последних 14 в противном случае.

y <- data.frame(days, price, regular)
y$max <- sapply(1:nrow(y), function(i) with(subset(y[1:i, ], regular == 1), 
        if (length(regular) == 0) NA else max(tail(price, 14))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...