如何使用for循环读入文件并将函数应用于每个文件以提供数据框列表

时间:2017-12-07 23:13:58

标签: r

我有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.shp。

上述每个形状文件都会给出其给定年份的地区地图。例如,第一个形状文件给出了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年的那个)用于其余代码。

我不知道如何解决这个问题。我已经尝试过谷歌搜索,我找不到任何可以做我想做的事情。

1 个答案:

答案 0 :(得分:0)

看起来你可能在i循环初始化中输入错字了吗?

for (i in length(files)) {
          ^

那只会迭代文件向量中的最后一个元素。如果要迭代所有这些,可以将其更改为:

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

或更有效率:

for (i in seq_along(files)) {

希望能解决它!