gpt4 book ai didi

string - 根据图层部分名称匹配选择堆栈中的栅格

转载 作者:行者123 更新时间:2023-12-04 12:33:04 25 4
gpt4 key购买 nike

我有一堆栅格(每个物种一个),然后我有一个带有纬度/长列以及物种名称的数据框。

fls = list.files(pattern="median")
s <- stack(fls)
df<-c("x","y","species name")

我希望能够一次只选择一个栅格以与提取功能一起使用。我希望选择基于基于物种名称列的部分匹配。我想这样做是因为栅格名称可能与物种列表中的名称不完全匹配,可能存在小写/大写不匹配或栅格图层名称可能更长,例如“species_name_median”,或者也可能是“_”而不是空白。
for(i:length(df.species name))
{
result<-extract(s[[partial match to "species name[i]" ]],df.xy)
}

我希望这是有道理的,我只想一次使用一个栅格进行提取。我可以使用 s[[i]] 轻松选择单个栅格,但不能保证列表中的每个物种都有其等效的栅格。

最佳答案

如果要查询的点数据由 x 和 y 坐标的 data.frame 以及要查询的图层的适当物种名称组成,则可以使用这两个命令来完成所有操作:

#  Find the layer to match on using 'grepl' and 'which' converting all names to lowercase for consistency
df$layer <- lapply( df$species , function(x) which( grepl( tolower(x) , tolower(names(s)) ) ) )


# Extract each value from the appropriate layer in the stack
df$Value <- sapply( seq_len(nrow(df)) , function(x) extract( s[[ df$layer[x] ]] , df[ x , 1:2 ] ) )

这个怎么运作

从第一行开始:
  • 首先我们定义一个新的列向量 df$layer这将是 rasterLayer 的索引在我们需要用于该行的堆栈中。
  • lapply沿列中的所有元素迭代 df$species并使用 df$species 中的每个项目应用匿名函数作为输入变量 x反过来。 lapply是一个循环结构,即使它看起来不像。
  • 在第一次迭代中,我们取 df$species 的第一个元素现在是 x并在 grepl 中使用它(意味着类似于“全局规则模式匹配逻辑”)来查找堆栈名称的哪些元素 s包含我们的物种模式。我们使用 tolower()在要匹配的模式 ( x ) 和要匹配的元素 ( names(s) ) 上,以确保即使在大小写不匹配的情况下也能匹配,例如"Tiger"找不到 "tiger" .
  • grepl返回一个逻辑向量,其中包含它找到的模式匹配的元素,例如grepl( "abc" , c("xyz", "wxy" , "acb" , "zxabcty" ) )返回 F , F , T , T .我们使用 which获取这些元素的索引。
  • 这个想法是我们得到一个,并且只有一个堆栈中的一层与每一行的物种名称匹配,所以唯一的 TRUE index 将是我们想要的堆栈中层的索引。

  • 在第二行, sapply :
  • sapply是一个很像 lapply 的迭代器但它返回一个向量而不是一个值列表。 TBH 你可以在这个用例中使用。
  • 现在我们遍历来自 1 的一系列数字至 nrow(df) .
  • 我们使用另一个匿名函数中的行号作为我们的输入变量 x
  • 我们要提取 "x""y" data.frame 的当前行(由 x 给出)的坐标(分别为第 1 列和第 2 列),使用我们在上一行中获得的层。
  • 我们将执行所有这些操作的结果分配给 data.frame 中的另一列,该列包含该 x/y 的提取值。相应图层的坐标

  • 我希望有帮助!!

    还有一个包含一些数据的工作示例:
    require( raster )
    # Sample rasters - note the scale of values in each layer
    # Tens
    r1 <- raster( matrix( sample(1:10,100,repl=TRUE) , ncol = 10 ) )
    # Hundreds
    r2 <- raster( matrix( sample(1e2:1.1e2,100,repl=TRUE) , ncol = 10 ) )
    # Thousands
    r3 <- raster( matrix( sample(1e3:1.1e3,100,repl=TRUE) , ncol = 10 ) )

    # Stack the rasters
    s <- stack( r1,r2,r3 )
    # Name the layers in the stack
    names(s) <- c("LIon_medIan" , "PANTHeR_MEAN_AVG" , "tiger.Mean.JULY_2012")


    # Data of points to query on
    df <- data.frame( x = runif(10) , y = runif(10) , species = sample( c("lion" , "panther" , "Tiger" ) , 10 , repl = TRUE ) )

    # Run the previous code
    df$layer <- lapply( df$species , function(x) which( grepl( tolower(x) , tolower(names(s)) ) ) )
    df$Value <- sapply( seq_len(nrow(df)) , function(x) extract( s[[ df$layer[x] ]] , df[ x , 1:2 ] ) )

    # And the result (note the scale of Values is consistent with the scale of values in each rasterLayer in the stack)
    df
    # x y species layer Value
    #1 0.4827577 0.7517476 lion 1 1
    #2 0.8590993 0.9929104 lion 1 3
    #3 0.8987446 0.4465397 tiger 3 1084
    #4 0.5935572 0.6591223 panther 2 107
    #5 0.6382287 0.1579990 panther 2 103
    #6 0.7957626 0.7931233 lion 1 4
    #7 0.2836228 0.3689158 tiger 3 1076
    #8 0.5213569 0.7156062 lion 1 3
    #9 0.6828245 0.1352709 panther 2 103
    #10 0.7030304 0.8049597 panther 2 105

    关于string - 根据图层部分名称匹配选择堆栈中的栅格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16524160/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com