2014-03-06 39 views
1

我有这样的代码在这里:被0除在r中,避免的NaN

d$ICER <- d$Delta_Cost/d$Delta_LY 

我这样做对于每一行,在R中一个矩阵,现在,第一行具有和Delta_LY = 0Delta_Cost值,所以ICER0/0,并给我一个值NaN

如何将它修改为0而不是NaN

回答

0

您可以使用ifelse

d$ICER <- ifelse(!d$Delta_Cost, 0, d$Delta_Cost/d$Delta_LY) 
+0

很好,谢谢:) 会接受在几分钟之内! – Dea12

2

你可以这样做:

d$ICER <- d$Delta_Cost/d$Delta_LY 
d$ICER[is.na(d$ICER)] <- 0 
0

虽然这两个答案在这里提供完全有效的办法来解决这个问题提供了他们都没有问题提供针对不断变化的警告NaNs为0,所以在这里你去。

如果您打算对您的数据运行的统计分析,天真地转换的NaN到0 会给你错误的答案。

这是一个极端的例子向您展示问题:

> test <- c(1,2,3,4,5,NaN,NaN,NaN,NaN,NaN) 
> test_zeros <- test 
> test_zeros[is.na(test_zeros)] <- 0 
> 
> mean(test) 
[1] NaN 
> mean(test_zeros) 
[1] 1.5 
> mean(test, na.rm = TRUE) 
[1] 3 
> 
> median(test) 
[1] NA 
> median(test_zeros) 
[1] 0.5 
> median(test, na.rm = TRUE) 
[1] 3 

的平均值和中位数test_zeros不能代表实际的数据。 使用na.rm是一个更好的选择,因为它从计算中移除共同的NaN行。 这仍然有它的问题,应该谨慎使用。

无论其中您选择使用您应该了解它会对你的分析效果的选项。