0

我想用 R 中的 Last Observation Carried Forward (LOCF) 方法替换所有 NA 值。我拥有的数据集如下:

Value1        Value2           Value3          Group
100           56               82              Group1
150           NA               97              Group2
NA            66               NA              Group3
120           NA               NA              Group4

我想创建以下数据集:

Value1        Value2           Value3          Group
100           56               82              Group1
150           56               97              Group2
150           66               97              Group3
120           66               97              Group4

任何有关如何做到这一点的见解将不胜感激。

4

3 回答 3

6
foo = function(x) {
    x[cummax((!is.na(x)) * seq_along(x))]
}

data.frame(lapply(df, foo))

如果第一个元素也可以NA,使用下面的函数

foo = function(x) {
    x[cummax(pmax(1, (!is.na(x)) * seq_along(x)))]
}
于 2020-03-02T02:28:32.570 回答
4

你可以使用fillfrom tidyr

tidyr::fill(df, everything())

#  Value1 Value2 Value3  Group
#1    100     56     82 Group1
#2    150     56     97 Group2
#3    150     66     97 Group3
#4    120     66     97 Group4

或与zoo::na.locf

df[] <- lapply(df, zoo::na.locf)

数据

df <- structure(list(Value1 = c(100L, 150L, NA, 120L), Value2 = c(56L, 
NA, 66L, NA), Value3 = c(82L, 97L, NA, NA), Group = structure(1:4, 
.Label = c("Group1", "Group2", "Group3", "Group4"), class = "factor")), 
class = "data.frame", row.names = c(NA, -4L))
于 2020-03-02T02:35:38.087 回答
0

我有一个非常简短的解决方案:

library("imputeTS")
na_locf(yourdataframe)

这就是你所需要的。包提供的所有其他时间序列插补算法也以相同的方式工作。该软件包坚持使用数字列,但非数字输入列将保持不变。

于 2021-10-28T14:13:26.790 回答