【问题标题】:Removing NA columns in xts删除 xts 中的 NA 列
【发布时间】:2012-10-27 09:31:59
【问题描述】:

我有一个格式如下的 xts

                   a        b     c        d       e        f   ......
2011-01-03         11.40    NA    23.12    0.23    123.11   NA  ......
2011-01-04         11.49    NA    23.15    1.11    111.11   NA  ......
2011-01-05         NA       NA    23.11    1.23    142.32   NA  ......
2011-01-06         11.64    NA    39.01    NA      124.21   NA  ......
2011-01-07         13.84    NA    12.12    1.53    152.12   NA  ......

我可以应用一个函数来生成一个新的 xts 或 data.frame 缺少仅包含 NA 的列吗?

带有 NA 的列的位置不是静态的,因此仅按名称或位置删除这些列是不可能的

【问题讨论】:

    标签: r xts quantmod


    【解决方案1】:

    假设DF 是你的data.frame

     DF [, -which(sapply(DF, function(x) sum(is.na(x)))==nrow(DF))]
                   a     c    d      e
    2011-01-03 11.40 23.12 0.23 123.11
    2011-01-04 11.49 23.15 1.11 111.11
    2011-01-05    NA 23.11 1.23 142.32
    2011-01-06 11.64 39.01   NA 124.21
    2011-01-07 13.84 12.12 1.53 152.12
    

    【讨论】:

    • 更强大的解决方案是:DF[, sapply(DF, function(x) sum(is.na(x)))!=nrow(DF)],因为即使没有包含所有缺失值的列,它也可以工作(请参阅我的答案)。
    【解决方案2】:

    @Jibersolution 有效,但如果没有包含所有NA 的列,可能会给您带来意想不到的结果。例如:

    # sample data
    library(xts)
    data(sample_matrix)
    x <- as.xts(sample_matrix)
    
    # Jiber's solution, when no columns have all missing values
    DF <- as.data.frame(x)
    DF[, -which(sapply(DF, function(x) sum(is.na(x)))==nrow(DF))]
    # data frame with 0 columns and 180 rows
    

    无论是否存在所有缺失值的列,以下解决方案都有效:

    y <- x[,apply(!is.na(x), 2, all)]
    x$High <- NA
    x$Close <- NA
    z <- x[,apply(!is.na(x), 2, all)]
    

    【讨论】:

      【解决方案3】:

      试试这个:

      dataframe[,-which(apply(is.na(dataframe), 2, all))]
      

      【讨论】:

      • 如果我不知道哪些列包含 NA?
      • 这会考虑任何给定的数据帧,而无需提前知道 NA。
      【解决方案4】:

      这似乎更简单:

      DF[, colSums(is.na(DF)) < nrow(DF)]
      

      【讨论】:

      • 应该是DF[, !colSums(!is.na(DF)) &lt; nrow(DF)]DF[, !colSums(is.na(DF)) &gt; 0] 才能工作...
      猜你喜欢
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 2021-10-14
      • 2020-01-25
      • 2019-03-21
      • 2013-01-11
      • 2020-01-07
      • 1970-01-01
      相关资源
      最近更新 更多