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

时间:2017-06-07 02:06:02

标签: r performance dataframe na

我想对数据框执行操作,忽略具有NA值的行(但是,我不想删除具有NA值的行,我仍然希望它们在数据中帧)。我实际上已经设法做到了这一点,但我的计算效率更高,因为我的非常非常慢。

比方说,我们有一个数据框如下:

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

我希望对此数据框执行操作,我希望在数据框中访问上一个/下一个Object,但条件是Number列没有{ {1}}该索引的值。例如,假设我在NA列的索引4处(这意味着'Number'是13而Number是Door),我想要访问下一个对象,以便Object列中没有NA值。这意味着,由于索引5在Number列中有NA,因此我会转到索引6,因为它在Number列中有14,因此我会将Cup作为对象而不是电脑

现在,如上所述,我实际上已经实现了一个这样的方法,通过基本上使用Numberwhich()以及min()等功能的组合来执行此任务。但我追求的是一个方法/函数,它的计算效率要高得多,因为我有很多数据要处理(我使用的方法非常慢且效率低,因为它需要检查大量值)。是否有更高效的计算方法来完成此任务?提前谢谢。

2 个答案:

答案 0 :(得分:0)

您可以尝试:

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

其中a是您的数据框,i是您当前所在的索引。

答案 1 :(得分:-1)

我建议您查看 na 功能。

这是一个很好的资源来源: HOW DOES R HANDLE MISSING VALUES?

看看下面代码的复杂性:

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 
        }
  }
}

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