R 中所有 NA 的最后观察结转(LOCF)
Last observation carried forward (LOCF) for all NA in R
我想用 R 中的最后一次观察结转 (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
任何有关如何执行此操作的见解都将不胜感激。
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)))]
}
您可以使用 tidyr
中的 fill
。
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))
我得到了一个非常简短的解决方案:
library("imputeTS")
na_locf(yourdataframe)
这就是您所需要的。对于包提供的所有其他时间序列插补算法,也以相同的方式工作。尽管该包坚持使用数字列,但非数字输入列将保持不变。
我想用 R 中的最后一次观察结转 (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
任何有关如何执行此操作的见解都将不胜感激。
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)))]
}
您可以使用 tidyr
中的 fill
。
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))
我得到了一个非常简短的解决方案:
library("imputeTS")
na_locf(yourdataframe)
这就是您所需要的。对于包提供的所有其他时间序列插补算法,也以相同的方式工作。尽管该包坚持使用数字列,但非数字输入列将保持不变。