如何根据组中位数更改数据中的值

How to change values in data depending on group median

一个简单的重现示例

d1 = structure(list(et = c("s", "s"), gg = c("d", "d"), hj = c("f", 
    "f"), ggh = c("h", "h"), wer = c(23L, 45L)), class = "data.frame", row.names = c(NA, 
    -2L))

其中 etgghjggh 是分类变量,wer 是度量变量。所以,对于这个类别

    et  gg  hj  ggh
    s   d   f   h

中位数(按 wer)为 34

还有第二个数据集

d2 <- structure(list(et = "s", gg = "d", hj = "f", ggh = "h", wer = 3L), class = "data.frame", row.names = c(NA, 
    -1L))

对于这个类别

    et  gg  hj  ggh
    s   d   f   h

wer 等于 3

如果在数据集 d2 中与 d1 相同类别的值 wer 小于或大于 1 上此类别的 d1 的中位数,那么在 d2 中如何做到这一点该类别中的中位数值。 因此,在这个简单的示例中,d2 中所需的输出将是

    et  gg  hj  ggh wer
    s   d   f   h   34

因为 d2 数据集中的 3 比 34(d1 中该类别的中位数)小 31。

感谢您的帮助。

您可以计算 d1 的中位数,然后在 d2 上执行 right_join:

library(dplyr)

d1 %>% 
  group_by(across(-wer)) %>% 
  summarise(wer = median(wer), .groups = "drop") %>% 
  right_join(d2, by = c("et", "gg", "hj", "ggh"), suffix = c("", ".y")) %>% 
  mutate(wer = ifelse(wer >= wer.y, wer, wer.y), .keep = "unused")

这个returns

# A tibble: 1 x 5
  et    gg    hj    ggh     wer
  <chr> <chr> <chr> <chr> <dbl>
1 s     d     f     h        34