使用 Tidyverse 对 Tibble 中的最后 X 值进行排名

问题描述 投票:0回答:1

我需要按组对小标题中的值进行排名(下例中的目标)。但是,我只想指定最后 10 个值的排名。例如,一旦我到达第 15 个值,我想根据值 5-15 提供该值的排名。

set.seed(123)

tib <- tibble(
  target = c(rep(1, 20), rep(2, 20)),
  session = rep(1:20, 2),
  value = runif(n = 40, min = 40, max = 100)
)

在上面的示例中,我有两个目标,每个目标都运行 20 个会话。每个目标在每个会话中都会产生一个值。该值应相对于前 10 个会话中的值进行排名。

我如何使用 tidyverse 函数来做到这一点?

我还没有找到解决这个问题的方法。我考虑过使用各种排名函数之一(例如,row_number、min_rank、dense_rank、ntile 或percent_rank),但无法弄清楚如何指定回溯窗口。

r dplyr
1个回答
0
投票

这看起来像一个滚动窗口的东西。我将使用

zoo::rollapply
进行演示。

library(dplyr)
tib |>
  group_by(target) %>%
  mutate(
    rank_last_10 = zoo::rollapplyr(value, 10, partial = TRUE,
                                   FUN = function(z) rank(z)[length(z)])
  ) |>
  ungroup()
# # A tibble: 40 × 4
#    target session value rank_last_10
#     <dbl>   <int> <dbl>        <dbl>
#  1      1       1  57.3            1
#  2      1       2  87.3            2
#  3      1       3  64.5            2
#  4      1       4  93.0            4
#  5      1       5  96.4            5
#  6      1       6  42.7            1
#  7      1       7  71.7            4
#  8      1       8  93.5            7
#  9      1       9  73.1            5
# 10      1      10  67.4            4
# # ℹ 30 more rows
# # ℹ Use `print(n = ...)` to see more rows

数据

tib <- structure(list(target = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), session = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L), value = c(57.2546512074769, 87.2983081266284, 64.538615308702, 92.9810442402959, 96.4280370576307, 42.7333899633959, 71.6863292828202, 93.5451426636428, 73.0861008679494,  67.3968841182068, 97.4100007209927, 67.2000493714586, 80.654238127172, 74.3580041173846, 46.175480959937, 93.9894982241094, 54.7652640612796, 42.5235720118508, 59.6752431569621, 97.2702189488336, 93.3723589638248, 81.568204369396, 78.4304088260978, 99.6561865974218, 79.3423479469493, 82.5118280900642, 72.6439614826813, 75.6485212268308, 57.3495842376724, 48.8268188387156, 97.7814539521933, 94.1379427071661, 81.442316705361, 87.7280450612307, 41.476821070537, 68.6677582655102, 85.507572251372, 52.9844761500135,  59.0908604580909, 53.8975471211597)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -40L))
© www.soinside.com 2019 - 2024. All rights reserved.