沿着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

我想添加一个";"体积";列。体积列中的方程式为:(1/3(*pi*高度*(半径1^2+半径2^2+(半径1*半径2(((这是截头体的体积!(。对于每棵树,我想运行这个方程,其中高度是饼干的高度加上它之前的高度(所以对于树C1T1饼干C,高度将是0.91+0.65+0.37(,半径1是它自己的半径,半径2将是它之前的饼干的半径(所以对于C1T1饼干C,半径2是饼干C1T1 B的半径(。另外,对于第一个";cookie";每棵树的高度-由于它以前没有高度,我不需要将其添加到任何东西中,对于半径2,它可以是自己再次使用的半径,因此半径1和半径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)))

最新更新