【发布时间】:2019-03-13 21:22:29
【问题描述】:
我有一个数据集,我想用前面的字符串替换 NA:
d <- data.frame(X = c("one", NA, "two", NA, "three", NA), Y = c(1:6),
stringsAsFactors = FALSE)
> d
X Y
1 one 1
2 <NA> 2
3 two 3
4 <NA> 4
5 three 5
6 <NA> 6
我想出了以下似乎很糟糕的解决方案:
v <- c()
for (i in seq_along(1:nrow(d))){
v[i] <- ifelse(is.na(d$X[i]) == TRUE, d$X[i-1], d$X[i])
}
d$X2 <- v
d
X Y X2
1 one 1 one
2 <NA> 2 one
3 two 3 two
4 <NA> 4 two
5 three 5 three
6 <NA> 6 three
我的问题:有没有更好的方法来做到这一点以及如何在 dplyr 管道中实现?
【问题讨论】:
-
您可以使用 dplyr 滞后创建一个滞后于 X 列的列,然后您可以使用 ifelse 而不必循环它!
-
@d.b
zoo::na.locf的文档提供了一个稍微简化的版本:ave(x, cumsum(!is.na(x)), FUN = function(x) x[1])