【问题标题】:R remove first row of data frame until first row has no NAR删除数据帧的第一行,直到第一行没有NA
【发布时间】:2016-10-17 00:22:49
【问题描述】:

我在数据框上应用 na.approx,如果 NA 恰好位于我的数据库的第一行或最后一行,这将不起作用。

如何编写执行以下操作的函数: "当数据框第一行任意值为NA时,删除第一行"

示例数据框:

x1=x2=c(1,2,3,4,5,6,7,8,9,10,11,12)
x3=x4=c(NA,NA,3,4,5,6,NA,NA,NA,NA,11,12)
df=data.frame(x1,x2,x3,x4)

此示例数据框的结果应如下所示:

result=df[-1:-2,]

我目前的尝试都与此类似:

replace_na=function(df){
while(anyNA(df[1,])=TRUE){
  df=df[-1,],
  return(df)
}  
#this is where I would apply the na.approx function to the data frame
}

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: r function dataframe while-loop na


    【解决方案1】:

    您可以使用complete.cases。使用cumsum,将删除第一个不完整的行:

    df[cumsum(complete.cases(df)) != 0, ]
       x1 x2 x3 x4
    3   3  3  3  3
    4   4  4  4  4
    5   5  5  5  5
    6   6  6  6  6
    7   7  7 NA NA
    8   8  8 NA NA
    9   9  9 NA NA
    10 10 10 NA NA
    11 11 11 11 11
    12 12 12 12 12
    

    【讨论】:

    • 你领先我 5 秒。 ...哦,好吧。
    • 感谢您的解决方案,它将对许多其他用户非常有帮助,也为我工作。我选择了另一个答案,因为它修复了我凌乱的代码,并且更容易应用于我的第二步(对最后一行执行相同操作)
    【解决方案2】:

    @Psidom 的回答很棒,但您也可以修复自己的自定义函数:

    replace_na=function(df){
       while(anyNA(df[1,])==TRUE){
          df=df[-1,]
       }
    #this is where I would apply the na.approx function to the data frame
    return(df)
    }
    

    在第二行,== 是您需要使用的等号。在第二行,逗号是多余的。最后,需要将return() 移出while 循环。

    replace_na(df)
    #    x1 x2 x3 x4
    # 3   3  3  3  3
    # 4   4  4  4  4
    # 5   5  5  5  5
    # 6   6  6  6  6
    # 7   7  7 NA NA
    # 8   8  8 NA NA
    # 9   9  9 NA NA
    # 10 10 10 NA NA
    # 11 11 11 11 11
    # 12 12 12 12 12
    

    【讨论】:

      【解决方案3】:

      我们也可以使用which.maxis.na

      df[which.max(!rowSums(is.na(df))):nrow(df),]
      #   x1 x2 x3 x4
      #3   3  3  3  3
      #4   4  4  4  4
      #5   5  5  5  5
      #6   6  6  6  6
      #7   7  7 NA NA
      #8   8  8 NA NA
      #9   9  9 NA NA
      #10 10 10 NA NA
      #11 11 11 11 11
      #12 12 12 12 12
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-08
        • 2011-11-24
        • 2019-11-14
        • 2020-01-29
        • 1970-01-01
        相关资源
        最近更新 更多