Получите максимум от объекта xts с помощью функции слияния

Привет, я использую библиотеку R Quantmod, и я хотел бы найти и вернуть максимум два значения (объем сегодня, против объема вчера).

require(quantmod)
getSymbols("HELE")
# Ok now when I do this it does not return a single column with the highest 
# volume 
head(    merge( HELE, max (HELE$HELE.Volume,lag(HELE$HELE.Volume, k=1    )  ) ) )

это обычно работает, потому что, например, я хочу вычесть сегодняшний максимум из вчерашнего закрытия, и я могу это сделать.

head(    merge(HELE, abs(HELE$HELE.High - lag(HELE$HELE.Close, k=1)   ) ) )

Я также пробовал применить функцию, но тоже не сработало,

head(    merge(HELE, as.xts(apply( c(lag(HELE$HELE.Volume, k=1    ), HELE$HELE.Volume    ), 1, max) )      ) )

Заранее спасибо. Ади


person Ahdee    schedule 13.05.2015    source источник


Ответы (1)


Попробуй это:

head(merge(HELE, pmax (HELE$HELE.Volume,lag(HELE$HELE.Volume, k=1), na.rm=TRUE)))

pmax - это векторизованная версия max, т.е. находит попарно max между двумя векторами. Вам также необходимо включить na.rm=TRUE, иначе вы получите NA с пропущенными значениями.

Используя только max, он найдет глобальный максимум между двумя векторами и создаст столбец, заполненный только этим значением.

Выход:

> head(merge( HELE, pmax (HELE$HELE.Volume,lag(HELE$HELE.Volume, k=1 )  , na.rm=T) ) )
           HELE.Open HELE.High HELE.Low HELE.Close HELE.Volume HELE.Adjusted HELE.Volume.1
2007-01-03     24.25     25.16    24.25      25.12      251800         25.12        251800
2007-01-04     25.15     25.50    25.06      25.49      224400         25.49        251800
2007-01-05     25.45     25.50    24.78      24.93      289700         24.93        289700
2007-01-08     24.82     25.19    24.65      24.69      285000         24.69        289700
2007-01-09     21.84     22.60    21.75      22.19     1534800         22.19       1534800
2007-01-10     22.11     22.50    21.87      22.45      293600         22.45       1534800
person LyzandeR    schedule 13.05.2015
comment
спасибо, это отлично работает; Я до сих пор не совсем понимаю, почему это не работает. Похоже, что некоторые функции, использующие слияние, не могут считывать данные для этой конкретной строки, например, знаете ли вы, почему первая функция не работает, а последняя - нет? head( merge(HELE, mean(c( HELE$HELE.High, HELE$HELE.Low, HELE$HELE.Close ) ))) ; head( merge(HELE, abs(HELE$HELE.High- HELE$HELE.Low- lag(HELE$HELE.Close,k=2 ) ) )) - person Ahdee; 14.05.2015
comment
Первый не работает, потому что среднее значение не выполняет строковых вычислений. Среднее не векторизуется. Для последовательного вычисления среднего вам необходимо использовать функцию типа apply. mean(c( HELE$HELE.High, HELE$HELE.Low, HELE$HELE.Close ) ) найдет среднее значение всех этих векторов. Вы этого не хотите. Вам нужны строковые средства, поэтому вы не можете использовать mean. По той же причине я использовал pmax вместо max. Попробуйте max(c(1,2), c(3,4)) и pmax(c(1,2), c(3,4)), и вы увидите разницу. К сожалению, функции pmean нет, поэтому вам нужно использовать apply с mean. - person LyzandeR; 14.05.2015
comment
С другой стороны, - векторизован, поэтому он будет работать должным образом. Я могу сказать это и по-другому: mean не векторизуется и, таким образом, уменьшит 2 вектора до одного значения. - векторизован, поэтому будет возвращен новый вектор того же размера, что и два отдельных начальных вектора. Надеюсь, это поможет. - person LyzandeR; 14.05.2015
comment
Да, объяснение работает, еще раз спасибо. Не могли бы вы случайно узнать, как использовать функцию задержки во время подачи заявки? что я хочу сделать, так это взять среднее значение максимума за период 14, но использование функции применения, похоже, не работает для этого. - person Ahdee; 14.05.2015
comment
Добро пожаловать :). Это хороший вопрос. Честно говоря, мне придется подумать об этом, потому что lag работает с time series объектами. Если вы все еще пытаетесь найти способ вычислить среднее значение строки, просто сделайте это самостоятельно: head( merge((HELE, HELE$HELE.High + HELE$HELE.Low + HELE$HELE.Close)/3 ))) . Это простой способ. Если вы все еще хотите узнать, как это сделать с apply (если это возможно), я предлагаю вам задать новый вопрос с воспроизводимым примером, подобным этому, и люди помогут. Я тоже смогу помочь позже. - person LyzandeR; 14.05.2015
comment
еще раз спасибо. Я, наконец, понял это, сначала поняв, что я хочу, благодаря другому посту в другом месте; это называется скользящим средним. Я использовал функцию rollapply, как таковую, meanXdays = rollapply(temp, 14, mean, na.pad = 1, align="right") - person Ahdee; 14.05.2015
comment
Очень рад, что смог помочь, и счастлив, что вы нашли что-то, что работает для вашей проблемы !! :) - person LyzandeR; 14.05.2015