Я рассчитываю взвешенное по сообществу среднее значение функциональных признаков (изучение лесного хозяйства). Я должен умножить относительную численность каждого вида (дерева) на значения признаков. У меня есть 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)