如何根据另一个 df 中的值使用向量中的值将值分配给 df 的列

How to assign a value to a column of a df using values from a vector according to a value in another df

我正在模拟种植园的生长。

我必须在每年(从第 0 年到第 6 年的列)中用 10 棵树(每行一棵)的体积填充 df。 我有一个来自包 "growthmodels" 的函数,它计算每年树的体积或创建一个包含年份范围内所有值的向量。 我有一个 df 每年每棵树的年龄(有些树死了必须重新种植,所以它们的年龄从零开始)。

这是问题的简化版本:

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)
        }
}

我需要保留循环 for (y in 2:6) 因为每年 chapmanRichards 公式中的因子 d 和 l 都有不同的值。

在 Base-R 中类似这样的东西给出了与你的循环相同的结果。

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