2

ファイル内の528.8933の値を-9999に置き換えようとしています

conne <- file("C:\\PHD\\72005ready\\latitude\\latitudefloat.bin", "rb")
   a<- readBin(conne, integer(), size=2,  n=360*720, signed=F)  
           a[a == 528.8933] <- -9999

上記のコードを使用しましたが、チェックしたところ、結果は変更されていません。助けてください


編集:

問題は解決されていません。もっと明確にします。ファイル内の528.8933の値を-9999に置き換えようとしています。

        t<- file("C:\\Users\\Amin\\Desktop\\1999n_Resample11.img",    "rb")
           e=readBin(t, double(), size=4,n=720*360, signed=TRUE)
          e[e != -9999] <- e[e != -9999]*0.0099 + 77.65 -273.15

上記のこのコードは、バイナリファイルを読み取ります。次に、eに対していくつかの計算を行います。それはうまくいきました。結果を確認するためにファイルを再度開いたところ、奇妙な数字(528.8933)が見つかりました。

次に、この行を使用しました:

e[e == 528.8933] <- -9999

528.8933の値を-9999に置き換えます。エラーは発生しませんでしたが、値をもう一度見てみると、そのままでした(528.8933はまだあります)。前もって感謝します

4

1 に答える 1

6

OK、最初:あなたは間違ったタイプで読んだ。値には小数が含まれているため、値は整数ではありません。したがって、numeric()の代わりにを使用して読み込む必要がありinteger()ます。これは本当に大きな違いになることに注意してください!

データを再度書き込むには、が必要ですがwriteBin()、タイプが正しいことを確認してください。

ささいな例:

整数でファイルを作りましょう:

a <- 1:10

myConn <- file('testBin.bin',open='wb')
writeBin(a,myConn)
close(myConn)

あなたがしたようにあなたはこれを再び読むことができます:

myConn <- file('testBin.bin',open='rb')
x <- readBin(myConn,integer(),n=10)
close(myConn)

これで、値を変更できます。これを行うことにより、タイプをintegerからnumeric!に変更することに注意してください。

> is.integer(x)
[1] TRUE
> x[x==5] <- 10
> is.integer(x)
[1] FALSE

以前と同じように、これを再度保存できます。

myConn <- file('testBin2.bin',open='wb')
writeBin(x,myConn)
close(myConn)

そして今、重要な部分です。を使用してこのファイルを読み込もうとするとinteger()、次のようになります。

> myConn <- file('testBin2.bin',open='rb')
> X <- readBin(myConn,integer(),n=10)
> close(myConn)
> X
 [1]          0 1072693248          0 1073741824          0 1074266112
 [7]          0 1074790400          0 1076101120

それはあなたが間違っていることです。で値を確認してくださいa。期待した値にはなりません。numeric()したがって、タイプとして使用する必要があります:

> myConn <- file('testBin2.bin',open='rb')
> X <- readBin(myConn,numeric(),n=10)
> close(myConn)
> X
 [1]  1  2  3  4 10  6  7  8  9 10

ヘルプファイルも?readBin注意深くお読みください。


あなたの編集への答え:

編集で話している問題は2つあるようです。

  1. 修正されたバイナリファイルを読み取るために正しいタイプを使用していません。class(e)計算を行った後などを使用して確認してください。おそらくそれはnumeric代わりにあなたに教えてくれますdouble

  2. 528.8933印刷された値はまさにその値であることが期待されます。そうではなく、丸めて印刷されますが、真の値は別のものです。したがって、真の値はたとえばであるため、比較e == 528.8933では何も返されません528.8933452...

それを回避するには、次のことを試してください。

round(e,4) == 528.8933

代わりは。

于 2012-05-13T11:27:15.187 に答える