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でも発生しています。NAではなく0を生成するだけではない理由を誰かが知っていますか?0-0のいくつかの合計は、NAではなく0を生成しているため、実際のパターンは表示されません。

どんな助けでも大歓迎です。ありがとう、

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

これを回避する1つの方法は、次の場合は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ます。

Col1すべてのpercentagを一度に計算し、とが両方ともゼロであるエントリに対してゼロを返す簡潔な方法を次に示し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
于 2012-05-21T10:48:59.450 に答える