如何对齐列表中的值的数量?

时间:2016-10-27 13:37:28

标签: r list alignment xts

我有一个包含三个xts的列表,其中包含一列。

:'xts' : 250 obs. of 1 variable:
:'xts' : 245 obs. of 1 variable:
:'xts' : 250 obs. of 1 variable:

XTS第二个数值最小。

如何平衡此列表中的变量数量? (值得记住的是,XTS有一个变量作为时间。)

下面是我将如何做的一个例子:

index    time       xts1 xts2 xts3
    1    2016-10-27  10  34  7
    2    2016-10-26  41      16
    3    2016-10-25  19  60  25
    4    2016-10-24  50      92
    5    2016-10-23  34  75  6

如果某些值不存在,只需删除缺少值的行。 也就是说,将2行和4行删除到列表中。

3 个答案:

答案 0 :(得分:3)

开始使用NA来表示缺失值而不是空格是值得的。出于数据结构的目的,进行此调整很重要。许多R对象必须是一种类型。插入空格会导致矩阵和向量被强制转换为"character"类型。如果将使用需要numeric元素的函数,则这不是期望的行为。

您可以像对待矩阵那样对xts对象进行子集化:

#Example
mat
               Open     High      Low    Close
2007-01-02 50.03978 50.11778 49.95041 50.11778
2007-01-03 50.23050       NA 50.23050 50.39767
2007-01-04 50.42096 50.42096 50.26414 50.33236
2007-01-05 50.37347       NA 50.22103 50.33459
2007-01-06 50.24433 50.24433 50.11121 50.18112
2007-01-07 50.13211 50.21561 49.99185 49.99185
2007-01-08 50.03555       NA 49.96971 49.98806
2007-01-09 49.99489 49.99489 49.80454 49.91333

我们可以按照惯例进行分组:

mat2 <- mat[!is.na( mat[,2] ),]

答案 1 :(得分:1)

假设您的数据位于数据框中,您可以执行以下操作:

    from numpy import *
    import cPickle
    import scipy.io as io
    from random import randrange

      y = [len(v) for v in batch_1.values()]

   Y = zeros([len(batch_1['data'][:]),3072])
   for i in range(len(batch_1['data'][:])):  #len() =10000  
        image = batch_1['data'][i]
        image.shape = (3, 32, 32)
        image_result = copy(image.transpose((1, 2, 0)))
        image_result = reshape(image_result, (1, 3072))
        Y[i] = image_result

结果:

df[rowSums(df[,3:5] == '') == 0,]

如果缺失值由 index time xts1 xts2 xts3 1 1 2016-10-27 10 34 7 3 3 2016-10-25 19 60 25 5 5 2016-10-23 34 75 6 s表示,则应将其更改为:

NA

使用df[rowSums(is.na(df[,3:5])) == 0,] 的优点是您可以检查多列中的缺失值。

正如@aichao所指出的,当你有单独的rowSums个对象时,你可以将xtsmerge结合使用。但是,我会使用all = FALSEReducesource)的组合:

merge

结果:

xts.c <- Reduce(function(...) merge(..., all = FALSE), list(xts1,xts2,xts3))
names(xts.c) <- c('xts1','xts2','xts3')

答案 2 :(得分:1)

由于您的xts对象已在列表中,因此最简单的方法是使用do.call与您的列表调用mergedo.call允许您将对象列表传递给merge,而不必手动输入所有名称。

library(xts)
# example data
dates <- seq(as.Date("2016-10-23"), as.Date("2016-10-27"), by = "day")
xtslist <- list(
  xts1 = xts(c(34, 50, 19, 41, 10), dates),
  xts2 = xts(c(75, 60, 34), dates[c(1, 3, 5)]),
  xts3 = xts(c(6, 92, 25, 16, 7), dates))
# merge all list elements into a single xts object
# Note: do.call(merge, xtslist) is equivalent to
#       merge(xtslist[[1]], xtslist[[2]], xtslist[[3]])
(myxts <- do.call(merge, xtslist))
#            xts1 xts2 xts3
# 2016-10-23   34   75    6
# 2016-10-24   50   NA   92
# 2016-10-25   19   60   25
# 2016-10-26   41   NA   16
# 2016-10-27   10   34    7

如果要省略NA行,可以调用na.omit(myxts),也可以使用all = FALSE参数merge.xts。以下是在all = FALSE命令中指定do.call的方法。

(myxts2 <- do.call(merge, c(xtslist, all = FALSE)))
#            xts1 xts2 xts3
# 2016-10-23   34   75    6
# 2016-10-25   19   60   25
# 2016-10-27   10   34    7