【问题标题】:How to align the number of values in the list?如何对齐列表中值的数量?
【发布时间】:2017-03-10 05:20:58
【问题描述】:

我有一个包含三个 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 行删除到列表中。

【问题讨论】:

    标签: r list alignment xts


    【解决方案1】:

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

    您可以像处理矩阵一样对@​​987654324@ 对象进行子集化:

    #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] ),]
    

    【讨论】:

      【解决方案2】:

      假设您的数据在数据框中,您可以这样做:

      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
      

      如果缺失值由NAs 表示,则应将其更改为:

      df[rowSums(is.na(df[,3:5])) == 0,]
      

      使用rowSums 的好处是可以检查多列中的缺失值。


      正如@aichao 所说,当您有单独的xts 对象时,您可以使用mergeall = FALSE 将它们组合成一个。但是,我会使用 Reducemerge (source) 的组合:

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

      结果:

      > xts.c
                 xts1 xts2 xts3
      2016-10-23   34   75    6
      2016-10-25   19   60   25
      2016-10-27   10   34    7
      

      【讨论】:

        【解决方案3】:

        由于您的 xts 对象已经在列表中,最简单的方法是使用 do.call 调用 merge 与您的列表。 do.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。以下是在 do.call 命令中指定 all = FALSE 的方法。

        (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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-17
          • 2020-05-03
          • 2021-07-29
          • 1970-01-01
          • 2018-06-02
          • 2014-04-30
          相关资源
          最近更新 更多