我目前有一个数据帧,看起来像这样
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)) (这是平截体的体积!)。对于每棵树,我想运行这个等式,其中height是cookie的高度加上它之前的高度(所以对于树C1T1 cookie C,高度是0.91+0.65+0.37),radius1是它自己的半径,radius2是它前面的cookie的半径(同样对于C1T1 cookie C,radius2是cookie C1T1 B的半径)。此外,对于每个树的第一个"cookie“-由于它没有以前的高度,我不需要将它添加到任何东西中,并且对于radius2,它可以是它自己的半径再次使用,因此它将是相同的值对于radius1和radius2)。任何关于如何做到这一点的建议都将不胜感激!
发布于 2020-11-12 21:18:34
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)))
https://stackoverflow.com/questions/64811494
复制相似问题