在xts上使用rowSums时保留xts索引

时间:2017-05-27 22:48:18

标签: r xts rowsum

在传递xts rowSums个对象时,有没有办法保留xts对象的索引?

目前我将结果重新命名为xts对象,但如果rowSums能够简单地返回它传递的内容,那么这似乎没有那么快。

xts(rowSums(abs(data)),index(data))

2 个答案:

答案 0 :(得分:3)

如果您的异议必须分开并将输入的组件放在一起,那么如果x是您的xts对象,那么试试这个。它直接返回一个xts对象:

Reduce("+", as.list(x))

答案 1 :(得分:3)

有趣的问题。我们忽略time.sleep()计算,因为它只是在很多时候与价格无关。如果您关心的是性能,那么这里有一组时间要考虑当前的建议:

import curses
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(7,GPIO.OUT)
GPIO.setup(11,GPIO.OUT)
GPIO.setup(13,GPIO.OUT)
GPIO.setup(15,GPIO.OUT)

screen = curses.initscr()
curses.noecho()
curses.cbreak()
screen.keypad(True)

try:
while True:
    char = screen.getch()
    if char == ord('q'):
        break

    elif char == curses.KEY_UP:
        GPIO.output(7,True)
        GPIO.output(11,False)
        GPIO.output(13,True)
        GPIO.output(15,False)
        time.sleep(.25)
        GPIO.output(7,False)
        GPIO.output(11,False)
        GPIO.output(13,False)
        GPIO.output(15,False)

    elif char == curses.KEY_DOWN:
        GPIO.output(7,False)
        GPIO.output(11,True)
        GPIO.output(13,False)
        GPIO.output(15,True)
        time.sleep(.25)
        GPIO.output(7,False)
        GPIO.output(11,False)
        GPIO.output(13,False)
        GPIO.output(15,False)

    elif char == curses.KEY_RIGHT:
        GPIO.output(7,False)
        GPIO.output(11,True)
        GPIO.output(13,True)
        GPIO.output(15,False)
        time.sleep(.25)
        GPIO.output(7,False)
        GPIO.output(11,False)
        GPIO.output(13,False)
        GPIO.output(15,False)

    elif char == curses.KEY_LEFT:
        GPIO.output(7,True)
        GPIO.output(11,False)
        GPIO.output(13,False)
        GPIO.output(15,True)
        time.sleep(.25)
        GPIO.output(7,False)
        GPIO.output(11,False)
        GPIO.output(13,False)
        GPIO.output(15,False)

    elif char == ord('w'):
        GPIO.output(7,True)
        GPIO.output(11,False)
        GPIO.output(13,True)
        GPIO.output(15,False)
        time.sleep(.1)
        GPIO.output(7,False)
        GPIO.output(11,False)
        GPIO.output(13,False)
        GPIO.output(15,False)

    elif char == ord('d'):
        GPIO.output(7,False)
        GPIO.output(11,True)
        GPIO.output(13,True)
        GPIO.output(15,False)
        time.sleep(.1)
        GPIO.output(7,False)
        GPIO.output(11,False)
        GPIO.output(13,False)
        GPIO.output(15,False)

    elif char == ord('s'):
        GPIO.output(7,False)
        GPIO.output(11,True)
        GPIO.output(13,False)
        GPIO.output(15,True)
        time.sleep(.1)
        GPIO.output(7,False)
        GPIO.output(11,False)
        GPIO.output(13,False)
        GPIO.output(15,False)

    elif char == ord('a'):
        GPIO.output(7,True)
        GPIO.output(11,False)
        GPIO.output(13,False)
        GPIO.output(15,True)
        time.sleep(.1)
        GPIO.output(7,False)
        GPIO.output(11,False)
        GPIO.output(13,False)
        GPIO.output(15,False)



finally:
curses.nocbreak(); screen.keypad(0); curses.echo()
curses.endwin()
GPIO.cleanup()

abs返回基础数字矩阵。我认为你可以期待的最快性能是由library(microbenchmark) sample.xts <- xts(order.by = as.POSIXct("2004-01-01 00:00:00") + 1:1e6, matrix(rnorm(1e6 *4), ncol = 4), dimnames = list(NULL, c("A", "B", "C", "D"))) # See how quickly rowSum works on just the underlying matrix of data in the timings below: xx <- coredata(sample.xts) microbenchmark( coredata(sample.xts), rowSums(xx), rowSums(sample.xts), rowSums(coredata(sample.xts)), .xts(x = rowSums(sample.xts), .index(sample.xts)), xts(rowSums(coredata(sample.xts)), index(sample.xts)), xts(rowSums(sample.xts),index(sample.xts)), Reduce("+", as.list(sample.xts)), times = 100) # Unit: milliseconds # expr min lq mean median uq max neval # coredata(sample.xts) 2.558479 2.661242 6.884048 2.817607 6.356423 104.57993 100 # rowSums(xx) 10.314719 10.824184 11.872108 11.289788 12.382614 18.39334 100 # rowSums(sample.xts) 10.358009 10.887609 11.814267 11.335977 12.387085 17.16193 100 # rowSums(coredata(sample.xts)) 12.916714 13.839761 18.968731 15.950048 17.836838 113.78552 100 # .xts(x = rowSums(sample.xts), .index(sample.xts)) 14.402382 15.764736 20.307027 17.808984 19.072600 114.24039 100 # xts(rowSums(coredata(sample.xts)), index(sample.xts)) 20.490542 24.183286 34.251031 25.566188 27.900599 125.93967 100 # xts(rowSums(sample.xts), index(sample.xts)) 17.436137 19.087269 25.259143 21.923877 22.805013 119.60638 100 # Reduce("+", as.list(sample.xts)) 21.745574 26.075326 41.696152 27.669601 30.442397 136.38650 100 y = .xts(x = rowSums(sample.xts), .index(sample.xts)) y2 = xts(rowSums(sample.xts),index(sample.xts)) all.equal(y, y2) #[1] TRUE 给出来进行计算,这可以被认为是&#34;基准&#34;。那么问题是,在coredata(sample.xts)对象中执行此操作的最快方法是什么。它似乎 rowSums(xx)提供了不错的表现。