我有一个数据集,我想用前面的字符串替换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管道中实现?
答案 0 :(得分:2)
tidyr
具有函数fill
,该函数以其上方最接近的无缺失值填充NA
。
如果您可以在X
中适当地填写值,则:
library(dplyr)
library(tidyr)
d %>%
fill(X)
#> X Y
#> 1 one 1
#> 2 one 2
#> 3 two 3
#> 4 two 4
#> 5 three 5
#> 6 three 6
或者,如果您需要保留原始X
的缺失值,请将其复制到另一列,然后将其填入:
d %>%
mutate(X2 = X) %>%
fill(X2)
#> 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
答案 1 :(得分:1)
这个怎么样?简化您的else if
系列的使用:
如果要创建新列
apply
如果您只想填充原始文件
d$X2 <- unlist(lapply(1:nrow(d), function(x){
ifelse(is.na(d[x,]$X), d[x-1,]$X, d[x,]$X)
}
))