Для функции цикла слишком много циклов - PullRequest
0 голосов
/ 03 сентября 2018

Я рассчитываю взвешенное по сообществу среднее значение функциональных признаков (изучение лесного хозяйства). Я должен умножить относительную численность каждого вида (дерева) на значения признаков. У меня есть 2 кадра, 1 с относительной численностью каждого вида в пределах каждого участка и один со средними значениями признаков для каждого вида. Я сделал цикл для автоматизации вычислений, но конечные результаты возвращают умножение 13 раз вместо 1 раза (у меня есть 13 участков, так что, возможно, это как-то связано с этим) Я уже занят этим сценарием в течение нескольких дней, так как я Я новичок в R, но я должен сделать это для моего мастерства. Я думаю, что сегодня достиг предела логического мышления и не могу найти свою ошибку :) Может кто-нибудь помочь мне, пожалуйста? Я вставлю скрипт ниже:

загрузить данные, применить имена некоторых столбцов, заполнить NA 0

library(data.table)
traits <- read.csv("Trait value.csv", sep = ";")

plots_Maiz <- read.csv("CWM Maiz plot.csv", sep = ";")

plots_Maiz[is.na(plots_Maiz)] <- 0

colnames(plots_Maiz) <- c("site", "species","y0","y1", "y2", "y3", "y4",    "y5")

traits[,1:17][is.na(traits[,1:17])] <- 0

#function for finding the corresponding species for a plot in the traitlist



       traitsf <- function(df, traitlist){
plottraits <- subset(traitlist, species %in% df[,2])
return(plottraits)
}

traitcalc <- function(traits, plots_Maiz){

multlist <- list()
blist <- list()
vmult <- vector()
tickcount <- 0

plotsplit <- split.data.frame(plots_Maiz, plots_Maiz$site)
testlist <- lapply(plotsplit, traitsf, traitlist = traits)


for (q in 1:length(plotsplit)){
df1 <- testlist[[q]]
df2 <- plotsplit[[q]]

plot <- as.character(plotsplit[[q]][1,1]) 


for (i in 1:nrow(df1)){

  v <- as.numeric(as.vector(t(df1[i,2:ncol(df1)]))) 

  species <- as.character(df1[i,1]) 


  for (j in 1:(ncol(df2)-2)){

    tickcount <- tickcount + 1
    vmult <-as.vector(v * (as.numeric(as.vector(df2[i,j+2])))) 

    vmult <- as.list(c(vmult, j-1, species, plot)) 


    multlist[[tickcount]] <- vmult 

  }  
}

b <- do.call(rbind, multlist) 
b <- data.table::rbindlist(multlist)


blist[[q]] <- b 

}

return(blist)
}

endresults <- traitcalc(traits,plots_Maiz) 
endresultsdf2<- do.call("rbind", endresults)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...