我正在尝试在我的文件中将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
将-9899的值替换为528.8933。我没有错误但是当我再次看到这些值时,我发现它们就像它们一样(528.8933仍在那里)。提前致谢
答案 0 :(得分:6)
好的,首先:你读错了类型。您的值不是整数,因为它们包含小数。因此,您必须使用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
。
回答您的修改:
您在编辑中谈到的问题似乎有两个:
您没有使用正确的类型来读取更正的二进制文件。在完成计算后,使用例如class(e)
检查。可能会告诉您numeric
而不是double
您希望打印值528.8933
正是该值。它不是,它是圆形的,但真正的价值是别的东西。因此,您的比较e == 528.8933
不会返回任何内容,因为真正的值将是528.8933452...
。
要解决这个问题,请尝试:
round(e,4) == 528.8933
代替。