Как присвоить значение столбцу df, используя значения из вектора в соответствии со значением в другом df - PullRequest
0 голосов
/ 26 мая 2020

Я моделирую рост плантации.

Мне нужно заполнить df объемом 10 деревьев (по одному в строке) за каждый год (столбцы с 0 по 6 год). У меня есть функция из пакета «growthmodels», которая вычисляет объем дерева для каждого года или создает вектор со всеми значениями в диапазоне лет. У меня есть df с возрастом каждого дерева каждый год (некоторые деревья d ie и их нужно пересаживать, поэтому их возраст начинается с нуля).

Вот упрощенная версия задачи:

volume <- data.frame(matrix(ncol = 6, nrow = 10))
age <- data.frame("y0" = rep(0, 10))
for (y in 2:6){
        d <- sample(1:10, 1)
        d0 <- 10-d
        age <- cbind(age, c(age[1:d, y-1] + rep(1, d), rep(0, d0)))
        names(age)[y] <- paste0("y", y-1)
}
library(growthmodels)
growth <- chapmanRichards(t=1:5, alpha=3, m=.4, k=.4, beta=1)

Я нашел следующий способ сделать это, но он очень медленный. Представьте, что мне нужно запустить его для большего количества видов и 100 случайных случаев с несколькими скоростями роста. У вас есть предложения?

#inputing normal growth
for (y in 2:6){
        for (t in 1:nrow(volume)) {
                volume[t,y] <- chapmanRichards(t=age[t,y], alpha=3*d, m=.4, k=.4*l, beta=1)
        }
}

Мне нужно сохранить l oop для (y в 2: 6), потому что каждый год коэффициенты d и l в формуле Чепмена Ричардса имеют разные значения.

1 Ответ

0 голосов
/ 26 мая 2020

что-то вроде этого в Base-R дает те же результаты, что и ваш l oop.

apply(age,2, function(y) sapply(y,function(x) chapmanRichards(t=x, alpha=3, m=.4, k=.4, beta=1) ))

      y0        y1        y2       y3        y4       y5
 [1,]  0 0.4720002 1.1098773 1.650880 2.0600919 2.354331
 [2,]  0 0.4720002 1.1098773 1.650880 2.0600919 2.354331
 [3,]  0 0.4720002 1.1098773 1.650880 2.0600919 2.354331
 [4,]  0 0.0000000 0.4720002 1.109877 1.6508796 2.060092
 [5,]  0 0.0000000 0.4720002 0.000000 0.4720002 1.109877
 [6,]  0 0.0000000 0.4720002 0.000000 0.4720002 1.109877
 [7,]  0 0.0000000 0.4720002 0.000000 0.4720002 0.000000
 [8,]  0 0.0000000 0.0000000 0.000000 0.4720002 0.000000
 [9,]  0 0.0000000 0.0000000 0.000000 0.0000000 0.000000
[10,]  0 0.0000000 0.0000000 0.000000 0.0000000 0.000000

Изменить : для ответа на ваш комментарий:

вы можете добиться этого с помощью

rbind(
    apply(age[1:3,],2, chapmanRichards, alpha=3, m=.4, k=.4, beta=1),
    apply(age[4:6,],2, chapmanRichards, alpha=3, m=.4, k=.4*7, beta=1),
    apply(age[7:10,],2, chapmanRichards, alpha=3, m=.4, k=0, beta=1)
)

Обновите до последнего комментария:

t(
cbind(
    apply(age[1:3,],1, chapmanRichards, alpha=3, m=.4, k=.4, beta=1),
    apply(age[4:6,],1, chapmanRichards, alpha=3, m=.4, k=.4*7, beta=1),
    apply(age[7:10,],1, chapmanRichards, alpha=3, m=.4, k=0, beta=1)
)
)

   y0        y1       y2        y3       y4        y5
1   0 0.4720002 1.109877 1.6508796 2.060092 2.3543308
2   0 0.4720002 0.000000 0.4720002 0.000000 0.4720002
3   0 0.4720002 0.000000 0.4720002 0.000000 0.4720002
4   0 0.0000000 0.000000 2.7021553 0.000000 2.7021553
5   0 0.0000000 0.000000 0.0000000 0.000000 2.7021553
6   0 0.0000000 0.000000 0.0000000 0.000000 2.7021553
7   0 0.0000000 0.000000 0.0000000 0.000000 0.0000000
8   0 0.0000000 0.000000 0.0000000 0.000000 0.0000000
9   0 0.0000000 0.000000 0.0000000 0.000000 0.0000000
10  0 0.0000000 0.000000 0.0000000 0.000000 0.0000000
...