根据 df +/- R 中的另一个值的值过滤行

时间:2021-02-18 14:23:14

标签: r filter dplyr mean

在此 df wb 中,我根据 2 个条件 T 计算 C2== "B" & C3== "AS1" 的平均值。然后我想根据计算出的 TmeanAS1 加减 1 过滤我的数据。然后我会做同样的事情来计算 TmeanAS1C2== "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"))

2 个答案:

答案 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 并过滤所有内容。