运行 个方程式,按 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)))
我目前有一个看起来像这样的数据框
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)))