更改栅格中的像元值
Changing cell values from a raster
我有 5 位数的栅格单元格值,但我需要去掉第一个数字,例如,如果单元格值为“31345”,我需要将其设为“1345”。
我正在尝试使用栅格包中的 calc() 函数通过基于栅格像元值(因为它们都是数字)减去不同的数字来做到这一点,如下所示:
correct.grid <- calc(grid, fun=function(x){ifelse(x < 40000, x-30000,
ifelse(x > 40000 & < 50000, x-40000,
ifelse(x > 50000 & < 60000, x-50000,
ifelse(x > 60000, x-60000, 0)))))})
我想这可能是解决问题的一种糟糕方法(我不太擅长编程),但我 运行 还是出错了,因为我在我猜的功能。关于如何使这些 "ifelse" 发挥作用或可能更聪明地解决问题的方法有什么想法吗?
如果有帮助,这是我数据中的一个唯一值:
> unique(grid)
[1] 30057 30084 30207 30230 30235 30237 30280 30283 30311 30319 30320 30326 30350 30351 30352 30360
[17] 30384 30396 30415 30420 30447 30449 30452 30456 30478 30481 30497 30507 30522 30560 30562 30605
[33] 30606 30612 30638 30639 30645 30654 30657 30658 30662 30665 30678 30682 30701 30707 30714 30736
[49] 30740 30743 30749 30750 30823 30824 30841 30852 30862 30892 30896 30898 30915 30920 30928 30934
[65] 30956 30962 30978 30986 30998 31021 31022 31031 31042 31053 31055 31081 31085 31092 31097 31099
[81] 31114 31115 31122 31126 31129 31130 31131 31141 31157 31168 31171 40019 40026 40075 40197 40217
[97] 50342 50360 50379 50496 50720 50725 50732 50766 50798 50837 51073 51092 51397 53096 53110 53117
[113] 53118 53120 53124 60003 60005 60041 60485 60516 60655 60661 60825 61039 61174 61185 61187 61210
[129] 61221 61224 61227 61259 61287 61289 61290 61295
如果您只想删除每个值的最左边的数字,如何:
首先,让我们加载一个光栅对象来处理:
library(raster)
# Load a raster object to work with
grid = system.file("external/test.grd", package="raster")
grid = raster(grid)
# Set up values to be whole numbers
values(grid) = round(values(grid)*100)
现在,从栅格中的每个值中删除最左边的数字:
values(grid) = as.numeric(substr(values(grid), 2, nchar(values(grid))))
请注意,在最左边的数字后有一个或多个零的值将缩短不止一位。比如60661会变成661,30001会变成1。
我有 5 位数的栅格单元格值,但我需要去掉第一个数字,例如,如果单元格值为“31345”,我需要将其设为“1345”。 我正在尝试使用栅格包中的 calc() 函数通过基于栅格像元值(因为它们都是数字)减去不同的数字来做到这一点,如下所示:
correct.grid <- calc(grid, fun=function(x){ifelse(x < 40000, x-30000,
ifelse(x > 40000 & < 50000, x-40000,
ifelse(x > 50000 & < 60000, x-50000,
ifelse(x > 60000, x-60000, 0)))))})
我想这可能是解决问题的一种糟糕方法(我不太擅长编程),但我 运行 还是出错了,因为我在我猜的功能。关于如何使这些 "ifelse" 发挥作用或可能更聪明地解决问题的方法有什么想法吗?
如果有帮助,这是我数据中的一个唯一值:
> unique(grid)
[1] 30057 30084 30207 30230 30235 30237 30280 30283 30311 30319 30320 30326 30350 30351 30352 30360
[17] 30384 30396 30415 30420 30447 30449 30452 30456 30478 30481 30497 30507 30522 30560 30562 30605
[33] 30606 30612 30638 30639 30645 30654 30657 30658 30662 30665 30678 30682 30701 30707 30714 30736
[49] 30740 30743 30749 30750 30823 30824 30841 30852 30862 30892 30896 30898 30915 30920 30928 30934
[65] 30956 30962 30978 30986 30998 31021 31022 31031 31042 31053 31055 31081 31085 31092 31097 31099
[81] 31114 31115 31122 31126 31129 31130 31131 31141 31157 31168 31171 40019 40026 40075 40197 40217
[97] 50342 50360 50379 50496 50720 50725 50732 50766 50798 50837 51073 51092 51397 53096 53110 53117
[113] 53118 53120 53124 60003 60005 60041 60485 60516 60655 60661 60825 61039 61174 61185 61187 61210
[129] 61221 61224 61227 61259 61287 61289 61290 61295
如果您只想删除每个值的最左边的数字,如何:
首先,让我们加载一个光栅对象来处理:
library(raster)
# Load a raster object to work with
grid = system.file("external/test.grd", package="raster")
grid = raster(grid)
# Set up values to be whole numbers
values(grid) = round(values(grid)*100)
现在,从栅格中的每个值中删除最左边的数字:
values(grid) = as.numeric(substr(values(grid), 2, nchar(values(grid))))
请注意,在最左边的数字后有一个或多个零的值将缩短不止一位。比如60661会变成661,30001会变成1。