R dense_rank 无序
R dense_rank without ordering
我正在寻找类似 dense_rank 的东西,它会忽略排名列的顺序。
# some data
df <- data.frame(
cat = c("A", "A", "B", "C", "A"),
date = seq.Date(from = as.Date("2020-01-01"), length.out = 5, by = "days")
)
# showing the intended order
df$custom_order <- c(1,1,2,3,4)
预期的结果是这样的。第二个A被认为是第一个A的一部分。第五个A是"new" A,因为前面的猫不是A.
cat date custom_order
1 A 2020-01-01 1
2 A 2020-01-02 1
3 B 2020-01-03 2
4 C 2020-01-04 3
5 A 2020-01-05 4
有这样的功能吗?我知道它可以通过一些 lag() 魔法来实现,但我希望有更简单的方法。
只要当前元素与前一个元素不匹配,我们就可以使用 data.table
中的 rleid
来更新索引
library(data.table)
library(dplyr)
df %>%
mutate(custom_order = rleid(cat))
# cat date custom_order
#1 A 2020-01-01 1
#2 A 2020-01-02 1
#3 B 2020-01-03 2
#4 C 2020-01-04 3
#5 A 2020-01-05 4
在base R
中,这可以通过rle
实现
df$custom_order <- with(rle(as.character(df$cat)), rep(seq_along(values), lengths))
我正在寻找类似 dense_rank 的东西,它会忽略排名列的顺序。
# some data
df <- data.frame(
cat = c("A", "A", "B", "C", "A"),
date = seq.Date(from = as.Date("2020-01-01"), length.out = 5, by = "days")
)
# showing the intended order
df$custom_order <- c(1,1,2,3,4)
预期的结果是这样的。第二个A被认为是第一个A的一部分。第五个A是"new" A,因为前面的猫不是A.
cat date custom_order
1 A 2020-01-01 1
2 A 2020-01-02 1
3 B 2020-01-03 2
4 C 2020-01-04 3
5 A 2020-01-05 4
有这样的功能吗?我知道它可以通过一些 lag() 魔法来实现,但我希望有更简单的方法。
只要当前元素与前一个元素不匹配,我们就可以使用 data.table
中的 rleid
来更新索引
library(data.table)
library(dplyr)
df %>%
mutate(custom_order = rleid(cat))
# cat date custom_order
#1 A 2020-01-01 1
#2 A 2020-01-02 1
#3 B 2020-01-03 2
#4 C 2020-01-04 3
#5 A 2020-01-05 4
在base R
中,这可以通过rle
df$custom_order <- with(rle(as.character(df$cat)), rep(seq_along(values), lengths))