【问题标题】:R - Loop through each row and fill with value from previous rowR - 遍历每一行并填充上一行的值
【发布时间】:2013-02-15 17:33:42
【问题描述】:

我想测试特定列中的值是否包含 NA 值,如果是,则用上一行中的值填充该 NA 空间。我仍在尝试掌握 apply 系列函数的窍门。

例如我想转这个:

      Date   Balance
2012-01-01      1000
2012-01-02        NA
2012-01-03        NA
2012-01-04      1200
2012-01-05      1215
2012-01-06        NA

进入:

      Date   Balance
2012-01-01      1000
2012-01-02      1000
2012-01-03      1000
2012-01-04      1200
2012-01-05      1215
2012-01-06      1215

【问题讨论】:

  • 看看来自 zoo 包的na.locf
  • 很高兴找到@Jilber。 apply 系列在这里不能很好地工作,因为您想要对给定值执行的操作取决于附近的值(即,您不能在 apply 函数中使用索引)。
  • 最简单的base 方法可能是for 循环(如果我错了,请纠正我):for (i in 1:length(DF$Balance)) if (is.na(DF$Balance[i])) DF$Balance[i] = DF$Balance[i-1]
  • @SeñorO 该 for 循环适用于该特定列 (DF$Balance) 中的每个观察 (i),但是如果您希望它遍历每一行中的每一列,您将如何做而不是每一行?
  • @coip 你只需要做两个 for 循环,但此时你真的应该得到 zoo 包并使用下面提到的na.locf,它会自动处理所有列给你

标签: r loops


【解决方案1】:

这是 zoo 包中 na.locf 函数的任务。见?na.locf

考虑DF 是你的data.frame,那么:

DF <- read.table(text="      Date   Balance
2012-01-01      1000
2012-01-02        NA
2012-01-03        NA
2012-01-04      1200
2012-01-05      1215
2012-01-06        NA", header=TRUE)

library(zoo)
na.locf(DF)
        Date Balance
1 2012-01-01    1000
2 2012-01-02    1000
3 2012-01-03    1000
4 2012-01-04    1200
5 2012-01-05    1215
6 2012-01-06    1215

【讨论】:

    【解决方案2】:

    data.tableroll = TRUE 一起使用也能很好地做到这一点!

    require(data.table)
    # convert Date column to date format
    df$Date <- as.Date(df$Date)
    # keep this, as we'll remove rows with NA to use `roll`
    dates   <- df$Date
    # remove rows with NA
    dt2     <- na.omit(data.table(df))
    # set key to Date
    setkey(dt2, "Date")
    # use dates which has the NA rows that will be filled 
    # with value from previous column with roll=T
    dt2[J(dates), roll=T]
    
    #          Date Balance
    # 1: 2012-01-01    1000
    # 2: 2012-01-02    1000
    # 3: 2012-01-03    1000
    # 4: 2012-01-04    1200
    # 5: 2012-01-05    1215
    # 6: 2012-01-06    1215
    

    【讨论】:

      猜你喜欢
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多