在此 df wb
中,我根据 2 个条件 T
计算 C2== "B" & C3== "AS1"
的平均值。然后我想根据计算出的 TmeanAS1
加减 1 过滤我的数据。然后我会做同样的事情来计算 TmeanAS1
的 C2== "B" & C3== "AS2"
,我需要以 {{ 1}} 在 AS1 中只有 T 值等于 TmeanAS1 +/- 1 和 AS21 中 T 值等于 TmeanAS2 +/- 1 等的行。
wb
# A tibble: 30 x 4
C1 C2 C3 T
<dbl> <chr> <chr> <dbl>
1 1 A AS1 61.5
2 2 A AS1 61.6
3 3 A AS1 61.9
4 4 B AS1 70.9
5 5 B AS1 70.9
6 6 B AS1 70.9
7 7 B AS1 70.7
8 8 C AS1 70.9
9 9 C AS1 70.9
10 10 C AS1 70.9
# … with 20 more rows
我的代码返回具有正确 Tmean 的 df,但 +/- 不起作用。我还可以提到 TmeanAS1 不需要是 df
structure(list(C1 = c(1, 2, 3, 4, 5, 6), C2 = c("A", "A", "A",
"B", "B", "B"), C3 = c("AS1", "AS1", "AS1", "AS1", "AS1", "AS1"
), T = c(61.5034980773926, 61.6354866027832, 61.8994636535645,
70.8747406005859, 70.8747406005859, 70.8747406005859)), row.names = c(NA,
-6L), class = c("tbl_df", "tbl", "data.frame"))
答案 0 :(得分:0)
也许是这样:
(TmeanAS1 <- mean(filter(wb, C2 == "B" & C3 == "AS1")$T))
# [1] 70.87474
wb %>%
filter(between(T, TmeanAS1 - 1, TmeanAS1 + 1))
# # A tibble: 3 x 4
# C1 C2 C3 T
# <dbl> <chr> <chr> <dbl>
# 1 4 B AS1 70.9
# 2 5 B AS1 70.9
# 3 6 B AS1 70.9
虽然我不建议将此作为一个实用的函数来保留,但让我演示一下 R 的内联运算符的创建和使用,用 %
-sandwich 表示:
`%+-1%` <- function(a, b) (a >= b-1) & (a <= b+1)
wb %>%
filter(T %+-1% TmeanAS1)
# # A tibble: 3 x 4
# C1 C2 C3 T
# <dbl> <chr> <chr> <dbl>
# 1 4 B AS1 70.9
# 2 5 B AS1 70.9
# 3 6 B AS1 70.9
运算符(函数)定义中的反引号是必需的,否则 R 会将 %
视为运算符本身(而不是对象名称中的合法字符)。
但最后,我们不需要任何“介于”逻辑,事实上:
filter(wb, abs(T - TmeanAS1) <= 1)
答案 1 :(得分:0)
T 是一个非常糟糕的列名称,因为 R 中的逻辑为 TRUE,所以我已将您的 T 重命名为“Tee”。
df %>%
group_by(C2, C3) %>%
mutate(Tmean = mean(Tee)) %>%
filter(Tee <= Tmean + 1 | Tee >= Tmean - 1)
您可以同时按 C2 和 C3 分组,然后计算整个批次的 Tmean 并过滤所有内容。