我在 R 中有数据框“fish_type”(见图)。
我想获得特定位置特定鱼类中特定化学物质的平均报告结果值。取平均值的规则是:如果对于特定鱼类类型、特定位置、特定化学名称,检测标志为“N”,则平均值为零。否则,平均值是直接平均值,无论检测标志如何。例如,HWY301 处“平头鱼”的 SR-90 平均值为 0。相反,HWY301 处“鲈鱼”的 Cs-137 平均值为 4.2。
我听说 R 中的循环很慢,所以我试图尽可能避免使用循环。考虑到上述平均规则,有人有 R 中计算平均值的方法吗?非常感谢。
我尝试过aggregate和dplyr的summary函数,但我无法用这些方法来适应平均规则。我对 R 还很陌生。
library(dplyr)
df %>%
summarize(mean = if_else(
any(detect_flag == "Y"), 0, mean(result)),
.by = c(loc, fish))
结果
loc fish mean
1 a bass 0
2 b bass 3
3 a flathead 0
4 b flathead 7
假数据(问题中包含的最佳实践)
df <- data.frame(loc = letters[1:2],
fish = rep(c("bass", "flathead"), each = 4),
result = 1:8,
detect_flag = rep(c("N", "N", "Y", "N")))
loc fish result detect_flag
1 a bass 1 N
2 b bass 2 N
3 a bass 3 Y
4 b bass 4 N
5 a flathead 5 N
6 b flathead 6 N
7 a flathead 7 Y
8 b flathead 8 N