【问题标题】:Fill NA row with previous value iteratively in R [duplicate]在R中迭代地用先前的值填充NA行[重复]
【发布时间】:2018-03-13 00:26:57
【问题描述】:

假设您在给定 df 的不同周内都有这样的事情:

DoW Value
Mon 1234
Tue NA
Wed 5678
Thu 9123
Fri 4567
Sat 8912
Sun 3456

我想在每周二的 NA 中填写其对应周的周一值。我该如何做到这一点,最好使用尽可能少的代码?

谢谢。

【问题讨论】:

  • ``图书馆(动物园); na.locf(DF, na.rm = FALSE). If the leading values cannot be NA then the na.rm=` 参数可以省略。如果您只想将其应用于一列而不是其他列,则 transform(DF, Value = na.locf0(Value)) 其中 na..locf0 类似于 na.locf 但默认为 na.rm=FALSE 并且仅处理向量。

标签: r date dataframe dataset


【解决方案1】:

这个呢?

mydf <- structure(list(DoW = c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", 
"Sun"), Value = c(1234L, NA, 5678L, 9123L, 4567L, 8912L, 3456L
)), .Names = c("DoW", "Value"), class = "data.frame", row.names = c(NA, 
-7L))

tuesd_na <- which(mydf$DoW == "Tue" & is.na(mydf$Value))
mydf$Value[tuesd_na] <- mydf$Value[tuesd_na - 1]
mydf
#>   DoW Value
#> 1 Mon  1234
#> 2 Tue  1234
#> 3 Wed  5678
#> 4 Thu  9123
#> 5 Fri  4567
#> 6 Sat  8912
#> 7 Sun  3456

【讨论】:

    【解决方案2】:

    您也可以使用tidyr::fill 来执行此操作。

    library('tidyverse')
    
    df <- tribble(
      ~DoW,  ~Value,
      'Mon', 1234,
      'Tue', NA,
      'Wed', 5678,
      'Thu', 9123,
      'Fri', 4567,
      'Sat', 8912,
      'Sun', 3456
    )
    
    fill(df, Value)
    # # A tibble: 7 x 2
    #     DoW Value
    #   <chr> <dbl>
    # 1   Mon  1234
    # 2   Tue  1234
    # 3   Wed  5678
    # 4   Thu  9123
    # 5   Fri  4567
    # 6   Sat  8912
    # 7   Sun  3456
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-19
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      相关资源
      最近更新 更多