2016-01-21 60 views
1

我想按年份重複列出一個列表。如果這些文件具有相同的名稱,這可能很容易解決,但事實並非如此。從列表中重複元素的子集對

名單如下:

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) 

不過,我現在有很多對的矩陣,我有點卡住進行選擇留級的。有沒有簡單的方法來做到這一點?我認爲我的缺乏經驗讓我「超編碼」這一點。

+0

請提交一個最小的可重複的例子。請參閱:[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。具體來說,你應該使用dput()' –

+0

分享你的(可重現性極低的)數據。你好Eric,字符串'list_raster'的列表是我的「數據」。我只想選擇該列表的年份中的重複項。 –

+1

埃裏克的意思是執行dput(list_raster)並將輸出粘貼到您的問題中,以便它更容易幫助您。 – andrnev

回答

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" 
) 
+0

by()似乎不起作用。它顯示錯誤:'函數(類,fdef,mtable)中的錯誤:無法找到函數'覆蓋'的簽名'因子','失蹤'''的繼承方法。 –