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

好的,首先:您读错了类型。您的值不是整数,因为它们包含小数。所以你必须阅读 usingnumeric()而不是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)

现在您可以更改一个值。请注意,通过这样做,您将类型从更改integernumeric

> 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)

现在是重要的部分。如果你尝试在 using 中读取这个文件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()as 类型:

> 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另请仔细阅读帮助文件。


回答您的编辑:

您在编辑中谈到的问题似乎是双重的:

  1. 您没有使用正确的类型来读取更正的二进制文件。class(e)在您进行计算之后使用例如检查。可能这会告诉你numeric而不是double

  2. 您期望打印的值528.8933正是该值。不是,它是四舍五入的,但真正的价值是别的东西。因此,您的比较e == 528.8933不会返回任何内容,因为真实值将是 eg 528.8933452...

要解决这个问题,请尝试:

round(e,4) == 528.8933

反而。

于 2012-05-13T11:27:15.187 回答