【问题标题】:R data frame slicingR数据帧切片
【发布时间】:2021-04-02 18:31:39
【问题描述】:

我有一个包含 4352 个观测值和 21 列的数据框。第一列是日期向量,其他 20 列是数字向量(代表股票价格)。由于在某些日子(即周末和节假日)没有交易,因此某些观察结果在 2:21 列中有 NA。

以下代码显示了逻辑数据框,指示存在 NA,并且测试数据框与输入表具有相同的维度。

test <- is.na(prices[, 2:21]) %>% as.data.frame()

但是,当我执行以下操作时,结果是 48052 个观察值,带有额外的行名称,例如NA.40755 等

test <- prices[is.na(prices[, 2:21]) == 0, ]

但是当我在切片列时使用逗号而不是冒号时,似乎我有所需的输出(即 2970 个观察值):

test <- prices[is.na(prices[, 2, 21]) == 0, ]

因此我的问题是为什么我必须切片 [, 2, 21] 而不是 [, 2:21] ?

【问题讨论】:

    标签: r dataframe slice


    【解决方案1】:

    is.na(prices[, 2:21]) 是一个具有TRUE/FALSE 值的逻辑矩阵。我不确定您在比较 == 0 时要做什么,因为这将返回相同维度的逻辑矩阵。您需要使用rowSums 将所有行值合并在一起,这样每行中只有一个值。

    如果您想删除包含所有 NA 值的行,您可以使用:

    prices <- prices[rowSums(!is.na(prices[, 2:21])) > 0, ]
    

    【讨论】:

    • 或者你可以使用 dplyr 包中的 drop_na()。
    • OP 没有在此处分享示例,因此很难绝对确定,但drop_na 删除了具有任何NA 值的行。在这里,我将删除所有 NA 值的行。
    【解决方案2】:

    我们可以使用Reduce 和lapply 来自base R

    prices <- prices[!Reduce(`&`, lapply(prices[2:21], is.na)),]
    

    【讨论】:

      猜你喜欢
      • 2013-07-24
      • 2020-08-02
      • 2012-02-01
      • 1970-01-01
      • 2022-11-03
      • 2019-10-29
      • 2016-12-05
      • 2019-07-22
      • 2018-10-18
      相关资源
      最近更新 更多