在R中从另一个数字中减去一个数字时出现NA

时间:2012-05-21 10:41:43

标签: r

我在R中有以下格式的数据:

Col1 Col2 
1    1
2    1
4    0
0    0
2    2
.    .
.    .
.    .

我正在使用以下脚本来计算Col1和&之间的百分比差异。每排Col2。

temp <- matrix(numeric(),dim(data)[1],1)

for (i in 1:dim(data)[1])
{
 temp[i,1]<- ((data[i,1]-data[i,2)/data[i,1])*100
}

由于某种原因,我的输出文件(temp)中有一些NA。它们即使在0-0时也会发生。有谁知道为什么它不只是生产0而不是NA?一些0-0的总和产生0而不是NA,所以我看不到任何真实的模式。

非常感谢任何帮助。谢谢,

2 个答案:

答案 0 :(得分:3)

你正在通过零错误进行经典除法。 R将此报告为NaN - 而不是数字,这是正确的。

x <-structure(list(
  Col1 = c(1L, 2L, 4L, 0L, 2L), Col2 = c(1L, 1L, 0L, 0L, 2L)), 
  .Names = c("Col1", "Col2"), class = "data.frame", row.names = c(NA, -5L))

with(x, (Col2-Col1)/Col1)
[1]  0.0 -0.5 -1.0  NaN  0.0

解决此问题的一种方法是在ifelse时使用Col==0返回零:

with(x, ifelse(Col1==0, 0, (Col2-Col1)/Col1))
[1]  0.0 -0.5 -1.0  0.0  0.0

如果您不想使用with,那么请编写这样的代码(更详细但相同):

ifelse(x$Col1==0, 0, (x$Col2-x$Col1)/x$Col1)
[1]  0.0 -0.5 -1.0  0.0  0.0

答案 1 :(得分:1)

对于这些条目,您将除以零:

(0 - 0) / 0

在数学上,这种划分的结果是not defined。为表明这一点,R将0/0评估为NaN

以下是一次计算所有百分比的简明方法,为Col1Col2均为零的条目返回零:

> data <- data.frame(Col1=c(1,2,4,0,2), Col2=c(1,1,0,0,2))
> pmax(100.0*(data$Col1-data$Col2)/data$Col1, 0, na.rm=T)
[1]   0  50 100   0   0