【问题标题】:What's an efficient way to perform operations with NA values in R?在 R 中使用 NA 值执行操作的有效方法是什么?
【发布时间】:2017-06-07 02:06:02
【问题描述】:

我想对忽略具有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 是门),我想访问下一个对象,这样就没有 @987654329 Number 列中的 @ 值。这意味着,由于索引 5 在Number 列中有NA,我会转而转到索引6,因为它在Number 列中有14,因此我将Cup 作为对象而不是计算机。

现在,如上所述,我实际上已经实现了一种这样的方法来执行这项任务,基本上是使用which()min()max() 等功能的组合,但我正在寻找一种方法/function 计算效率更高,因为我有很多数据要处理(我使用的方法非常缓慢且效率低,因为它需要检查大量值)。有没有一种计算效率更高的方法来完成这项任务?提前致谢。

【问题讨论】:

  • 请准确说明您拥有什么(代码+数据)以及您想要什么。您描述的过程似乎是迭代的,这通常不是 R 中最有效的

标签: r performance dataframe na


【解决方案1】:

你可以试试:

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

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

【讨论】:

  • 这样看起来更好,但是有什么办法可以修改它,这样我每次使用is.na()时就不需要查看整个列?
【解决方案2】:

我建议你研究一下 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 
        }
  }
}

当然,您可以部署单行函数。

【讨论】:

  • 这看起来确实很有用,但它看起来像是创建了原始数据帧的新副本,除了没有 NA 值,所以在这种情况下它会占用内存。理想情况下,我想要一个方法或函数,它基本上会查看一个元素,如果它是 NA 则忽略它,然后移动到下一个元素
  • 对不起,如果这是一个愚蠢的问题,但你能解释一下代码的目的吗?或者更确切地说,您为什么将其添加到您的回复中?
  • 你试过我分享给你的sn-p吗?如果没有,请尝试,然后告诉我您的建议。
猜你喜欢
  • 2014-01-06
  • 2011-12-06
  • 2013-12-18
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
相关资源
最近更新 更多