【问题标题】:Impute NA values with previous value in R用 R 中的先前值估算 NA 值
【发布时间】:2018-02-26 14:26:31
【问题描述】:

我们有 101 个变量(公司)的收盘价。我们得到了很多 NA 值(因为股票市场在周六和周日休市 -> 在我们的数据中给出 NA 值),如果有之前的值,我们需要用之前的值来估算这些 NA 值但我们没有成功. This is our data example

还有一些公司在最初几年没有数据,因为他们没有上市,所以他们有这段时期的 NA 值。有些公司破产并开始拥有 NA 值,因此它们都应该变为 0。 我们应该怎么做,因为我们有几个条件来填补我们的 NA's

提前致谢。

【问题讨论】:

  • na.locf函数
  • 1.不要使用图像,请执行head(my data) 并将其粘贴到您上面的问题中。 2. 有几列有NA,这是/是您需要修复的?
  • @abhiieor OK 那么na.locf 是什么包?
  • 这很令人沮丧——在 cmets 中是一个体面但半固定的问题和半个答案。
  • 为了完整起见,na.locf 来自zoo-package

标签: r


【解决方案1】:

我对规则的理解是:

  • 全部为 NA 的列将保留为全部 NA
  • 前导 NA 值保留为 NA
  • 内部 NA 值替换为最新的非 NA 值
  • 尾随 NA 值替换为 0

为了尝试这一点,我们使用内置数据框BOD 将第一行、第三行和最后一行替换为NA 并添加一列NA 值——见最后的注释。

我们定义了一个逻辑向量ok,每列有一个元素,TRUE 表示至少有一个元素不是NA 的列,FALSE 表示其他列。然后只对okTRUE 的列进行操作,我们使用na.fill0 填充尾随NA 值。然后我们用na.locf填充内部NA的值。

library(zoo)

ok <- !apply(is.na(BOD), 2, all)
BOD[, ok] <- na.locf(na.fill(BOD[, ok], c(NA, NA, 0)), na.rm = FALSE)

给予:

  Time demand  X
1   NA     NA NA  <-- leading NA values are left intact
2    2   10.3 NA
3    2   10.3 NA  <-- interior NA values are filled in with last non-NA value
4    4   16.0 NA
5    5   15.6 NA
6    0    0.0 NA  <- trailing NA values are filled in with 0

注意

我们在上面使用了以下输入:

BOD[c(1, 3, 6), ] <- NA
BOD <- cbind(BOD, X = NA)

更新

修复。

【讨论】:

  • 前导数也应为 0,如果我使用您的代码,它将适用于我的所有列,因为我有 101 个列。
  • 如果您希望前导和尾随 NA 值都为 0,请在 c(0, NA, 0) 中使用 c(0, NA, 0)。我们可以从答案中的可重复示例中看到它处理了所有列。
  • ok
  • 我认为这与我的第一列有关,该列是日期的并且没有 NA 值所以我尝试子集 ok
  • 我需要一个可重现的小示例来说明问题,例如我在答案中提供的问题。 (请注意,SO 问题中应包含最少的完整可重复示例,这就是为什么您得到如此多的反对意见。请参阅minimal reproducible example。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2012-02-19
  • 2018-03-13
  • 2023-03-13
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多