【问题标题】:Replace NA with preceding character string in vector [duplicate]用向量中的前面字符串替换 NA [重复]
【发布时间】: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 管道中实现?

【问题讨论】:

标签: r dplyr


【解决方案1】:

tidyr 有一个函数fill 用它上面最接近的非缺失值填充NAs。

如果您可以在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

【讨论】:

    【解决方案2】:

    这个怎么样?简化您对apply 家庭的使用: 如果你想创建一个新列

    d$X2 <- unlist(lapply(1:nrow(d), function(x){
                      ifelse(is.na(d[x,]$X), d[x-1,]$X, d[x,]$X)
                      }
           ))
    

    如果你只想填原图

    d$X <- unlist(lapply(1:nrow(d), function(x){
                      ifelse(is.na(d[x,]$X), d[x-1,]$X, d[x,]$X)
                      }
           ))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-28
      • 2021-12-06
      • 2015-10-08
      • 2020-09-14
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多