R语言 用随机数量的重复值索引有序向量[重复]

sg3maiej  于 2023-09-27  发布在  其他
关注(0)|答案(2)|浏览(101)

此问题已在此处有答案

Create group number for contiguous runs of equal values(5个答案)
17天前关闭

df<-data.frame(old=c(1,1,1,5,7,7,7,11,13,13,16,18,20,20,20,20,25,25,25,29),
               new=c(1,1,1,2,3,3,3,4,5,5,6,7,8,8,8,8,9,9,9,10))

   old new
1    1   1
2    1   1
3    1   1
4    5   2
5    7   3
6    7   3
7    7   3
8   11   4
9   13   5
10  13   5
11  16   6
12  18   7
13  20   8
14  20   8
15  20   8
16  20   8
17  25   9
18  25   9
19  25   9
20  29  10

如何将old轻松转换为new?基本上,它是重复相同次数的值的顺序。价值总是在增加。
先谢了。我都不知道怎么谷歌这么简单的东西。

mznpcxlj

mznpcxlj1#

您可以使用dplyr::consecutive_iddata.table::rleid来获取每次相同值运行的标识符:

df <- data.frame(
  old = c(1, 1, 1, 5, 7, 7, 7, 11, 13, 13, 16, 18, 20, 20, 20, 20, 25, 25, 25, 29)
)

library(dplyr, warn.conflicts = FALSE)
library(data.table)

df |>
  mutate(new = consecutive_id(old))
#>    old new
#> 1    1   1
#> 2    1   1
#> 3    1   1
#> 4    5   2
#> 5    7   3
#> 6    7   3
#> 7    7   3
#> 8   11   4
#> 9   13   5
#> 10  13   5
#> 11  16   6
#> 12  18   7
#> 13  20   8
#> 14  20   8
#> 15  20   8
#> 16  20   8
#> 17  25   9
#> 18  25   9
#> 19  25   9
#> 20  29  10

df |>
  mutate(new = rleid(old))
#>    old new
#> 1    1   1
#> 2    1   1
#> 3    1   1
#> 4    5   2
#> 5    7   3
#> 6    7   3
#> 7    7   3
#> 8   11   4
#> 9   13   5
#> 10  13   5
#> 11  16   6
#> 12  18   7
#> 13  20   8
#> 14  20   8
#> 15  20   8
#> 16  20   8
#> 17  25   9
#> 18  25   9
#> 19  25   9
#> 20  29  10
jdgnovmf

jdgnovmf2#

您实际上只是检查旧列何时更改。你可以通过多种方式来实现这一点,但最简单的是检查df$old中的前一个值是否与当前值匹配,然后找到其累积和:

df$new <- cumsum(df$old != dplyr::lag(df$old, default = 0))

df$new <- cumsum(df$old != c(0, df$old[-nrow(df)]))

library(dplyr)
df |> mutate(new = cumsum(old != lag(df$old, default = 0)))

df$new <- cumsum(diff(c(0, df$old)) > 0)

df |> mutate(new = cumsum(diff(c(0, old)) > 0)

相关问题