0

我在 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 所以我看不到任何真实的模式。

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

4

2 回答 2

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
于 2012-05-21T10:51:26.437 回答
1

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

(0 - 0) / 0

从数学上讲,这种除法的结果是没有定义的。为了表明这一点,R 评估0/0NaN

这是一次计算所有百分比的简洁方法,对于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
于 2012-05-21T10:48:59.450 回答