在 R 中使用 NA 值执行操作的有效方法是什么?



我想在数据框架上执行操作,该数据框架忽略了使用NA值的行(但是,我不想用NA值删除行,我仍然希望它们在数据中框架(。我实际上已经设法这样做了,但是我采用了一种更高效的方法,因为我的非常慢。

例如,我们有一个数据框,如下:

Number    |   Object
  10      |   Car
  11      |   Book
  12      |   Pen 
  13      |   Door   
  NA      |   Computer    
  14      |   Cup
  15      |   Book

我希望在此数据框架上执行一个操作,我想在数据框架中访问上一个/下一个Object,但仅在Number列没有该索引的NA值的条件下。例如,假设我在Number列中的索引4(这意味着"数字"为13,而Object是门(,我想访问下一个对象,以便在Number列中没有NA值。这意味着,由于索引5在Number列中具有NA,因此我将转到索引6,因为它在Number列中具有14个,因此我将杯作为对象而不是计算机。

现在,如上所述,我实际上已经实现了一种这样的方法来通过基本使用诸如which()min()max()等函数组合执行此任务由于我有很多数据可以使用(我使用的方法非常缓慢且效率低下,因此计算上有效的效率很高(因为它需要检查大量值(。是否有更有效的方法来完成此任务?预先感谢。

您可以尝试:

a$Object[!is.na(a$Number)][i+1]

其中 a是您的数据框,而 i是您当前处于的索引。

我建议您查看 na 函数。

以下是一个很好的来源:R如何处理丢失值?

查看以下代码的复杂性:

a<-data.frame(c(15,25,35,NA,55),c("a","b","c","d","e"))
colnames(a)<-c("Number","Object")
a
i = 1
while(i<length(a$Number)-1){
  if (!is.na(a$Number[i])){
     if (!is.na(a$Number[i+1])){
        print(a$Object[i+1])
        i = i + 1
        }
     else{
        print(a$Object[i+2])
        i = i + 2 
        }
  }
}

当然,您可以部署单线功能。

最新更新