用向量中的前面的字符串替换NA

时间:2019-03-13 21:22:30

标签: r dplyr

我有一个数据集,我想用前面的字符串替换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管道中实现?

2 个答案:

答案 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)
                  }
       ))