如何使用循环读取文件中并将功能应用于每个文件以提供数据帧列表



我有3个数据帧:

dataF <- data.frame(year = c(1986, 1987, 1988, 1988, 1999),  Female_ID = c("A1","B1","C1","E1","D1"), Terr = c("TAT", "CAT", "PLU", "GER", "ATT")) 
dataM <- data.frame(year = c(1986, 1986, 1986, 1987, 1987, 1988, 1988, 1988, 1988, 1999, 1999),
Male_ID = c("F1", "G1", "H1", "I1", "J1", "K1", "L1", "M1", "N1", "O1", "P1"), Terr = c("GAT","URS","OPI","INN","WOF","DUG","WAT","YUU","WRF","HUT","RIT")

基因组:为您提供上面男性和女性的每种可能组合的相关性。看起来像这样:

    Male_ID   Female_ID  Pair1  Pair2  relatedness
         F1          A1  F1 A1  A1 F1         0.02
    etc...

我有4个形状文件:lala_d1986_t.shp,lala_d1987t.shp,lala_d1988_t.shp,lala_d1989_t.t.ssp。

上面的每个形状文件都提供了其给定年份的领土图。例如,第一个形状文件提供了1986年的地图。

在1986年至1989年的每一年中,我都会阅读其形状文件,将一些功能应用于它,以便为我提供每个领土的邻近地区列表;在给定年份中将dataf和datam设置为;使用DATAF,DATAM和该年度每个地区的邻近地区列表,以创建一个数据框架,该数据框架与每个雌性与她所在地区周围地区的每个男性配对;然后,我发现使用基因组数据框架所有这些对之间的相关性,然后我将女性及其所有男性伴侣的平均相关性与仅具有女性ID,年份和平均相关性的数据框架创建。

我已经拥有所有的功能可以完成我想做的事情,但是我在创建一个代码方面遇到困难,该代码使我可以立即完成所有这些操作,而无需一年一度手动执行此操作。具体来说,我每年都很难阅读正确的形状文件。

我尝试过:

   files <- c(lala_d1986_t.shp,  lala_d1987t.shp, lala_d1988_t.shp, lala_d1989_t.shp)
   listofdfs <- list()
   for(j in c(1986:1989) {
     for(i in length(files)){
       getinfo.shape(paste(files[[i]]))
       FSJShape <- readOGR(paste(files[[i]]))
       FSJShape <- subset(FSJShape, TERRYR!='<NA>')
       listofpositions_year <- gTouches(FSJShape, byid = TRUE, returnDense = FALSE)
       listofneighterr_year <- lapply(listofpositions_year, function(x) FSJShape$TERRYR[x])
       names(listofneighterr_year) <- FSJShape$TERRYR
       listofneighterr_year[] <- lapply(listofneighterr_year, as.character)
       dataF_year <- subset(dataF, year == j)
       dataM_year <- subset(dataM, year == j)
       ...
       final_df
       listofdfs[[j]] <- final_df
     }
   }

当我运行此功能时,它会给我一个错误,说它找不到某个列名。我已经在每年的for循环中完成了代码,所以我知道所有这些都起作用。我认为问题在于我在for循环中的前两行中使用糊状功能的方式。它立即读取所有形状文件,并使用其余代码中读取的最后一个形状文件(1989年)。

我不确定如何解决这个问题。我已经尝试过谷歌搜索,但找不到任何能做我想做的事情的东西。

看起来您可能在i循环初始化中有错字?

for (i in length(files)) {
          ^

只能在文件向量中的最后一个元素上迭代。如果您想迭代所有内容,则可以将其更改为:

for (i in 1:length(files)) {

或更有效地:

for (i in seq_along(files)) {

希望修复它!

最新更新