用R中data.frame中的值替换光栅类

用R中data.frame中的值替换光栅类,r,dataframe,raster,R,Dataframe,Raster,我有一个整数光栅的分类结果。现在我想用数据帧中的浮点值替换这些类,即光栅类1=0.321;第2类=0.232;第3类=3.211。 dataframe有许多列,我想为几种不同的情况替换这些类: Class C N .... 1 0.321 0.001 2 0.232 0.012 3 3.211 0.021 有没有一种方法可以方便地做到这一点,比如将data.frame合并到光栅中? 我需要将生成的光栅与另一个光栅相乘以生成输出 这是光栅文

我有一个整数光栅的分类结果。现在我想用数据帧中的浮点值替换这些类,即光栅类1=0.321;第2类=0.232;第3类=3.211。 dataframe有许多列,我想为几种不同的情况替换这些类:

Class C      N      ....
1    0.321   0.001 
2    0.232   0.012 
3    3.211   0.021 
有没有一种方法可以方便地做到这一点,比如将data.frame合并到光栅中? 我需要将生成的光栅与另一个光栅相乘以生成输出

这是光栅文件的元数据:

 > LCC
 class       : RasterLayer 
 dimensions  : 3296, 3711, 12231456  (nrow, ncol, ncell)
 resolution  : 2, 2  (x, y)
 extent      : 514151.8, 521573.8, 7856419, 7863011  (xmin, xmax, ymin, ymax)
 coord. ref. : +proj=utm +zone=55 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
 data source : /home/..../Raster.tif 
 names       : Raster 
 values      : 0, 255  (min, max)
`

这是数据帧的元数据:

 >str(SOC)
 data.frame':   11 obs. of  57 variables:
  $ class             : int  8 9 5 6 7 4 1 2 3 0 ...
  $ area              : int  3135964 3941744 9048672 8564312 11568512     
  $ pixel_count       : int  783991 985436 2262168 2141078 2892128 ...
  $ percent_area      : Factor w/ 11 levels "0.17%","17.50%",..: 9 11 3 2 
  $ label.x           : Factor w/ 11 levels "Barren",..: 5 8 2 
  $ label.y           : Factor w/ 8 levels "Barren",..: 4 7 2 
  $ n                 : int  7 4 4 3 4 1 1 NA NA NA ...
  $ mean_C_100cm      : num  25.8 29 21.3 34.8 31.9 ...
  $ mean_N_100cm      : num  0.469 0.514 0.503 0.621 0.34 ...
 ....

`

如果我正确理解您的要求,那么您可以通过以下方式使用
df
中列中的值分配光栅值:

inp[] <- df[inp[],"C"]

希望这有帮助。

如果我正确理解您的要求,那么您可以使用
df
中列中的值通过以下方式指定光栅的值:

inp[] <- df[inp[],"C"]
希望这有帮助。

有一个函数(
subs
)可以实现这一点

示例数据(在achaio之后)

有一个函数(
subs
)用于此

示例数据(在achaio之后)

我修改了的示例,改为使用重分类函数。以下是一种对我有效的方法:

library(raster)
set.seed(42)  ## for reproducibility

inp <- raster(ncol=10, nrow=10) ## example is small, yours will be large
inp[] <- floor(runif(ncell(inp), min=1, max=4))  ## generate integers from 1 to 3

df <- data.frame(Class=c(1,2,3), C=c(10.321,1.232,0.211), N=c(0.001,0.012,0.021))  ## your df

## generate output raster the same size as inp
out <- raster(ncol=10,nrow=10)


#### here I generate a matrix that defines the
#### reclassification with an upper and lower limit

mtr <- data.frame(cl_low =df$Class -1, cl_high = df$Class, C =df$C)
data.matrix(mtr)  ### use as matrix

# now reclassify using the matrix and transfer the result in a raster brick

out <- reclassify(inp, rcl=mtr)
out.brick <- brick(x=out)

# now the same can be done for next variable
mtr <- data.frame(cl_low =df$Class -1, cl_high = df$Class, N =df$N)
data.matrix(mtr)
out <- reclassify(inp, rcl=mtr)
out.brick <- addLayer(out.brick, out)
out.brick@layers
库(光栅)
设定种子(42)##用于再现性
inp我用重分类函数修改了的示例。以下是一种对我有效的方法:

library(raster)
set.seed(42)  ## for reproducibility

inp <- raster(ncol=10, nrow=10) ## example is small, yours will be large
inp[] <- floor(runif(ncell(inp), min=1, max=4))  ## generate integers from 1 to 3

df <- data.frame(Class=c(1,2,3), C=c(10.321,1.232,0.211), N=c(0.001,0.012,0.021))  ## your df

## generate output raster the same size as inp
out <- raster(ncol=10,nrow=10)


#### here I generate a matrix that defines the
#### reclassification with an upper and lower limit

mtr <- data.frame(cl_low =df$Class -1, cl_high = df$Class, C =df$C)
data.matrix(mtr)  ### use as matrix

# now reclassify using the matrix and transfer the result in a raster brick

out <- reclassify(inp, rcl=mtr)
out.brick <- brick(x=out)

# now the same can be done for next variable
mtr <- data.frame(cl_low =df$Class -1, cl_high = df$Class, N =df$N)
data.matrix(mtr)
out <- reclassify(inp, rcl=mtr)
out.brick <- addLayer(out.brick, out)
out.brick@layers
库(光栅)
设定种子(42)##用于再现性

inp是所需输出的浮点光栅(或光栅砖),其值映射到C、N等列?如果我理解正确,则为是。所需输出是浮点光栅(或光栅砖),其值映射到C、N等列吗?如果我理解正确,则为是。谢谢,在示例中它似乎起作用,但我的原始数据被严重扭曲了。可能是因为数据框中的值是以数字形式存储的吗?@mace您能否提供一个合理的大小示例,说明数据严重失真的原因?这可能是因为您的数据具有因子,而不仅仅是数字整数。您能否提供光栅输出(即仅打印光栅变量以输出其元数据)并在您的帖子中提供
str(df)
的输出(即编辑帖子而不是回复此评论)?好的,谢谢您的帮助。我想出了一个可行的解决方案,稍后我会发布。谢谢,在这个例子中它似乎是可行的,但我的原始数据被严重扭曲了。可能是因为数据框中的值是以数字形式存储的吗?@mace您能否提供一个合理的大小示例,说明数据严重失真的原因?这可能是因为您的数据具有因子,而不仅仅是数字整数。您能否提供光栅输出(即仅打印光栅变量以输出其元数据)并在您的帖子中提供
str(df)
的输出(即编辑帖子而不是回复此评论)?好的,谢谢您的帮助。我想出了一个可行的解决方案,稍后我会发布。谢谢Robert,这是迄今为止最优雅的解决方案。不过,在大文件(100 MB)上使用重新分类要快很多。谢谢Robert,这是迄今为止最优雅的解决方案。不过,在大文件(100 MB)上使用重新分类要快很多。
y <- subs(inp, df, by=1, which=2:3)
z <- reclassify(inp, as.matrix(df)[, 1:2])
library(raster)
set.seed(42)  ## for reproducibility

inp <- raster(ncol=10, nrow=10) ## example is small, yours will be large
inp[] <- floor(runif(ncell(inp), min=1, max=4))  ## generate integers from 1 to 3

df <- data.frame(Class=c(1,2,3), C=c(10.321,1.232,0.211), N=c(0.001,0.012,0.021))  ## your df

## generate output raster the same size as inp
out <- raster(ncol=10,nrow=10)


#### here I generate a matrix that defines the
#### reclassification with an upper and lower limit

mtr <- data.frame(cl_low =df$Class -1, cl_high = df$Class, C =df$C)
data.matrix(mtr)  ### use as matrix

# now reclassify using the matrix and transfer the result in a raster brick

out <- reclassify(inp, rcl=mtr)
out.brick <- brick(x=out)

# now the same can be done for next variable
mtr <- data.frame(cl_low =df$Class -1, cl_high = df$Class, N =df$N)
data.matrix(mtr)
out <- reclassify(inp, rcl=mtr)
out.brick <- addLayer(out.brick, out)
out.brick@layers