【问题标题】:Subset pairs of repeated elements from a list列表中重复元素的子集对
【发布时间】:2016-01-21 19:52:30
【问题描述】:

我正在尝试按年份对包含重复文件的列表进行子集化。如果文件具有相同的名称,这很容易解决,但事实并非如此。

列表如下:

 dput(list_raster)
    c("F101992.v4b_web.stable_lights.avg_vis.tif", "F101993.v4b_web.stable_lights.avg_vis.tif", 
    "F101994.v4b_web.stable_lights.avg_vis.tif", "F121994.v4b_web.stable_lights.avg_vis.tif", 
    "F121995.v4b_web.stable_lights.avg_vis.tif", "F121996.v4b_web.stable_lights.avg_vis.tif", 
    "F121997.v4b_web.stable_lights.avg_vis.tif", "F121998.v4b_web.stable_lights.avg_vis.tif", 
    "F121999.v4b_web.stable_lights.avg_vis.tif", "F141997.v4b_web.stable_lights.avg_vis.tif", 
    "F141998.v4b_web.stable_lights.avg_vis.tif", "F141999.v4b_web.stable_lights.avg_vis.tif", 
    "F142000.v4b_web.stable_lights.avg_vis.tif", "F142001.v4b_web.stable_lights.avg_vis.tif", 
    "F142002.v4b_web.stable_lights.avg_vis.tif", "F142003.v4b_web.stable_lights.avg_vis.tif", 
    "F152000.v4b_web.stable_lights.avg_vis.tif", "F152001.v4b_web.stable_lights.avg_vis.tif", 
    "F152002.v4b_web.stable_lights.avg_vis.tif", "F152003.v4b_web.stable_lights.avg_vis.tif", 
    "F152004.v4b_web.stable_lights.avg_vis.tif", "F152005.v4b_web.stable_lights.avg_vis.tif", 
    "F152006.v4b_web.stable_lights.avg_vis.tif", "F152007.v4b_web.stable_lights.avg_vis.tif", 
    "F152008.v4b_web.stable_lights.avg_vis.tif", "F162004.v4b_web.stable_lights.avg_vis.tif", 
    "F162005.v4b_web.stable_lights.avg_vis.tif", "F162006.v4b_web.stable_lights.avg_vis.tif", 
    "F162007.v4b_web.stable_lights.avg_vis.tif", "F162008.v4b_web.stable_lights.avg_vis.tif", 
    "F162009.v4b_web.stable_lights.avg_vis.tif", "F182010.v4d_web.stable_lights.avg_vis.tif", 
    "F182011.v4c_web.stable_lights.avg_vis.tif", "F182012.v4c_web.stable_lights.avg_vis.tif", 
    "F182013.v4c_web.stable_lights.avg_vis.tif")

如您所见,有多个年份文件重复(i.e. 1994, 1997-1999, 2000-2003, etc.)。我的想法是使用raster::overlay 函数构建一个包含重复年份文件对的列表,以表示它们的值。我尝试了以下方法:

    library(stringr)  
    #Create a list of only the years of the files
    year_list <- lapply(list_raster, str_sub, 4, 7)
    #Select the duplicate years
    duplicated_years <- year_list[duplicated(year_list)]
    #Select the duplicate file-years
    duplicated_rasters <- list_raster[lapply(list_raster, str_sub, 4, 7) %in% duplicated_years]
    #Make all the pairs between files
    duplicated_rasters <- combn(duplicated_rasters, 2, simplify=T)

尽管如此,我现在有一个包含很多对的矩阵,我有点卡住了选择重复的年份。有一种简单的方法可以做到这一点吗?我认为我的经验不足使我对此“过度编码”。

【问题讨论】:

  • 请提交一个可重现的最小示例。请参阅:How to create a Minimal, Complete, and Verifiable example。具体来说,您应该使用dput() 分享您的(最小可重复性)数据
  • 你好 Eric,字符串列表list_raster 是我的“数据”。我只想按此列表的年份选择重复项。
  • Eric 的意思是执行 dput(list_raster) 并将输出粘贴到您的问题中,以便我们更轻松地为您提供帮助。
  • 对不起,我没听懂建议。谢谢 Eric 和 andrnev。

标签: r string list raster


【解决方案1】:

您可以在此处使用by 按年份组应用功能(出现overlay)。当然,您应该首先从文件名中提取年份:

 by(xx,INDICES=substr(xx,4,7),FUN = function(x)## function body)

其中 xx 是您的文件列表:

  dput(head(xx))
c("F101992.v4b_web.stable_lights.avg_vis.tif", "F101993.v4b_web.stable_lights.avg_vis.tif", 
"F101994.v4b_web.stable_lights.avg_vis.tif", "F121994.v4b_web.stable_lights.avg_vis.tif", 
"F121995.v4b_web.stable_lights.avg_vis.tif", "F121996.v4b_web.stable_lights.avg_vis.tif"
)

【讨论】:

  • by() 似乎不起作用。它显示一个错误:Error in (function (classes, fdef, mtable) : unable to find an inherited method for function ‘overlay’ for signature ‘"factor", "missing"’.
猜你喜欢
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 2013-01-30
  • 2018-12-22
  • 2016-06-22
相关资源
最近更新 更多