如何使用R替换文件中的单个值?

时间:2012-05-13 10:20:47

标签: r

我正在尝试在我的文件中将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仍在那里)。提前致谢

1 个答案:

答案 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


回答您的修改:

您在编辑中谈到的问题似乎有两个:

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

  2. 您希望打印值528.8933正是该值。它不是,它是圆形的,但真正的价值是别的东西。因此,您的比较e == 528.8933不会返回任何内容,因为真正的值将是528.8933452...

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

    round(e,4) == 528.8933
    

    代替。