运行 个方程式,按 r 中的列分类

Running equations by categories along a column in r

我目前有一个看起来像这样的数据框

tree cookie height radius
C1T1   A     0.37   12.3
c1t1   B     0.65   14.2
C1T1   C     0.91   16
C1T2   A     0.2    4
C1T2   B     0.5    10
C1T2   C     0.75   12.4

我想向这个数据框添加一个“volume”列。体积列中的方程为:(1/3) * pi * height * (radius1^2 + radius2^2 + (radius1*radius2))(这是平截头体的体积!)。对于每棵树,我想 运行 这个等式,其中高度是 cookie 的高度加上它之前的高度(因此对于树 C1T1 cookie C,高度将是 0.91+0.65+0.37),radius1 是它的自己的半径,radius2 将是它之前的 cookie 的半径(同样对于 C1T1 cookie C,radius2 将是 cookie C1T1 B 的半径)。此外,对于每棵树的第一个“cookie”——因为它没有以前的高度,所以我不需要将它添加到任何东西中,对于 radius2 它可以再次使用它自己的半径,所以它与 radius1 和 radius1 的值相同半径 2)。非常感谢任何有关如何执行此操作的建议!

library(tidyverse)

df <- tribble(
  ~tree, ~cookie, ~height, ~radius1,
  "C1T1", "A", 0.37, 12.3,
  "C1T1", "B", 0.65, 14.2,
  "C1T1", "C", 0.91, 16,
  "C1T2", "A", 0.2, 4,
  "C1T2", "B", 0.5, 10,
  "C1T2", "C", 0.75, 12.4
)

df <- df %>%
  group_by(tree) %>%
  # Sort by height just to be safe
  arrange(tree, height) %>%
  mutate(
    cumheight = cumsum(height),
    radius2 = lag(radius1),
    radius2 = if_else(is.na(radius2), radius1, radius2),
    volume = 1/3 * pi * cumheight * (radius1^2 + radius2^2 + (radius1 * radius2)))