【问题标题】:R: Replace NA entries with the non NA entry from before [duplicate]R:用之前的非NA条目替换NA条目[重复]
【发布时间】:2016-08-26 18:58:02
【问题描述】:

我的数据框中有一列如下所示:

Sally
NA
NA
Bob
NA
Jill
NA
NA

使用 R 代码,我怎样才能让它看起来像这样:

Sally
Sally
Sally
Bob
Bob
Jill
Jill 
Jill

谢谢

更新:我编写了自己的函数“FillMe(x)”,其中输入是列。

FillMe = function(x) {
  empty = c()
  for (i in x){

if (is.na(i) == F) {
  empty = c(empty,i)
} else {
  y = empty[length(empty)]
  empty = c(empty,y)
}
  }
  return(empty)
}

【问题讨论】:

    标签: r replace dataframe na


    【解决方案1】:

    我们可以使用na.locf

    library(zoo)
    df1$Col <- na.locf(df1$Col)
    df1$Col
    #[1] "Sally" "Sally" "Sally" "Bob"   "Bob"   "Jill"  "Jill"  "Jill"  
    

    或者不使用任何包

    with(df1, ave(Col, cumsum(!is.na(Col)), FUN = function(x) x[!is.na(x)]))
    #[1] "Sally" "Sally" "Sally" "Bob"   "Bob"   "Jill"  "Jill"  "Jill" 
    

    数据

     df1 <- structure(list(Col = c("Sally", NA, NA, "Bob", NA, "Jill", NA, 
    NA)), .Names = "Col", class = "data.frame", row.names = c(NA, -8L))
    

    【讨论】:

    • 作为旁注,如果您使用tidyrfill 会在那里完成工作。
    • @VincentBonhomme 您可以将其作为单独的答案发布
    【解决方案2】:

    这是一个tidyr 选项:

    # using the data provided by @akrun
    df1 <- structure(list(Col = c("Sally", NA, NA, "Bob", NA, "Jill", NA, 
                                  NA)), .Names = "Col", class = "data.frame", row.names = c(NA, -8L))
    
    # we load tidyr, install.packages("tidyr") if you don't have it yet
    library(tidyr)
    
    # then fill does the job - fill(df1, 1) works fine as well
    fill(df1, Col)
    
    > fill(df1, Col)
    Col
    1 Sally
    2 Sally
    3 Sally
    4   Bob
    5   Bob
    6  Jill
    7  Jill
    8  Jill
    

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 2023-03-21
      相关资源
      最近更新 更多