我在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,所以我看不到任何真实的模式。
非常感谢任何帮助。谢谢,
答案 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
。
以下是一次计算所有百分比的简明方法,为Col1
和Col2
均为零的条目返回零:
> 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