r - 根据 R 中下一个有序组值获取每组的下一个值

标签 r dataframe dplyr

我想根据下一个有序数找到每组的下一个值。在组 2 中的以下可重现示例中,我们有两次子组 1,这意味着对于这两个值,下一个值应来自子组 2,即 4。这是一些可重现的数据 (df dput如下):

> df
   group subgroup value
1      1        1     9
2      1        2     8
3      1        3     7
4      2        1     8
5      2        1     6
6      2        2     4
7      2        3     2
8      3        1     2
9      3        1     3
10     3        2     7
11     3        3     9 

如果我们尝试将它与下一行号一起使用,我们当然会得到错误值,如下所示:

library(dplyr)

df %>%
  group_by(group) %>%
  mutate(next_value = value[row_number()+1])
#> # A tibble: 11 × 4
#> # Groups:   group [3]
#>    group subgroup value next_value
#>    <dbl>    <dbl> <dbl>      <dbl>
#>  1     1        1     9          8
#>  2     1        2     8          7
#>  3     1        3     7         NA
#>  4     2        1     8          6
#>  5     2        1     6          4
#>  6     2        2     4          2
#>  7     2        3     2         NA
#>  8     3        1     2          3
#>  9     3        1     3          7
#> 10     3        2     7          9
#> 11     3        3     9         NA

我的所需输出应如下所示:

   group subgroup value next_value
1      1        1     9          8
2      1        2     8          7
3      1        3     7         NA
4      2        1     8          4
5      2        1     6          4
6      2        2     4          2
7      2        3     2         NA
8      3        1     2          7
9      3        1     3          7
10     3        2     7          9
11     3        3     9         NA

创建于 2023 年 8 月 24 日 reprex v2.0.2

所以我想知道是否有人知道如何使用 R 获取每个组的下一个有序即将到来的值?


df 的dput:

df <- structure(list(group = c(1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3), subgroup = c(1, 
2, 3, 1, 1, 2, 3, 1, 1, 2, 3), value = c(9, 8, 7, 8, 6, 4, 2, 
2, 3, 7, 9)), class = "data.frame", row.names = c(NA, -11L))

最佳答案

假设子组从 1:n 开始按顺序连续,您可以执行以下操作:

library(dplyr)

df |>
  mutate(next_value = value[match(subgroup, subgroup - 1)], .by = group)

     group subgroup value next_value
1      1        1     9          8
2      1        2     8          7
3      1        3     7         NA
4      2        1     8          4
5      2        1     6          4
6      2        2     4          2
7      2        3     2         NA
8      3        1     2          7
9      3        1     3          7
10     3        2     7          9
11     3        3     9         NA

如果它们是有序的但不连续或者是一个因子或字符,您可以这样做:

df |>
  mutate(tmp = match(subgroup, unique(subgroup)),
         next_value = value[match(tmp, tmp - 1)],
         tmp = NULL, .by = group)

关于r - 根据 R 中下一个有序组值获取每组的下一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76969378/

相关文章:

python - Pandas - 逗号分隔行中的每个字符串在数据框中出现的频率

python - 使用 pandas 根据另一个数据帧的行值填充列值

r - 加入两个具有最接近时间戳间隔的数据集

r - Shiny 的服务器安装 : Server not responding on port 3838

r - 如何用特定颜色表示等高线图(fill.contour)中的最佳区域?

r - 使用 `devtools::build_vignette` 编译小插图,以便 .md 保存在小插图目录中

python - Pandas df.style.bar 同时保持四舍五入

r - 如何在 R 中的单个折线图上绘制矩阵的列

r - 枢轴更广泛的多选项问卷

R 计算日期范围之间每月发生的频率