我有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年的那个)用于其余代码。
我不知道如何解决这个问题。我已经尝试过谷歌搜索,我找不到任何可以做我想做的事情。
答案 0 :(得分:0)
看起来你可能在i
循环初始化中输入错字了吗?
for (i in length(files)) {
^
那只会迭代文件向量中的最后一个元素。如果要迭代所有这些,可以将其更改为:
for (i in 1:length(files)) {
或更有效率:
for (i in seq_along(files)) {
希望能解决它!