在R中迭代地用先前的值填充NA行[重复]

Posted

技术标签:

【中文标题】在R中迭代地用先前的值填充NA行[重复]【英文标题】:Fill NA row with previous value iteratively in R [duplicate] 【发布时间】: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 并且仅处理向量。 【参考方案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

【讨论】:

以上是关于在R中迭代地用先前的值填充NA行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

用R中的组中的非NA字符替换一组值的NA [重复]

R:在第一列中按重复项合并行

在R向量中“向下”复制单元格值的惯用方法[重复]

在R中删除带有NA的行[重复]

删除 R 中的半重复行

r从缺失值以上的单元格中复制值[重复]