标识符为以 1 开头的序列
Identifier as sequence starting with 1
我的数据集中有一个 ID,指示观察所属的用户。我想将其重新编码为以 1.
开头的序列
示例数据
da1 <- data.frame(player = c(120,120,120,47,47,18,18,18), wins = c(0,2,1,0,0,2,0,1))
da1
player wins
1 120 0
2 120 2
3 120 1
4 47 0
5 47 0
6 18 2
7 18 0
8 18 1
我希望它看起来像这样:
da2 <- data.frame(player = c(1,1,1,2,2,3,3,3), wins = c(0,2,1,0,0,2,0,1))
da2
player wins
1 1 0
2 1 2
3 1 1
4 2 0
5 2 0
6 3 2
7 3 0
8 3 1
我试过下面的代码,但它为每个用户创建了一个序列。
library(tidyverse)
da1 %>%
group_by(id) %>%
mutate(start = 1:n())
我认为 tidyverse
解决方案类似于:
da1$player <-
da1 %>%
group_by(player) %>%
group_indices()
如果您愿意考虑 data.table
并且您的数据已经订购,您可以这样做:
da1$player <- data.table::rleid(da1$player)
> da1
player wins
1 1 0
2 1 2
3 1 1
4 2 0
5 2 0
6 3 2
7 3 0
8 3 1
或一路data.table
解(对顺序不敏感):
setDT(da1)[, player := .GRP, by = player]
da1
另一个base R
备选方案:
as.integer(factor(-da1$player))
da2 <- transform(da1, id=match(player, unique(player)))
我的数据集中有一个 ID,指示观察所属的用户。我想将其重新编码为以 1.
开头的序列示例数据
da1 <- data.frame(player = c(120,120,120,47,47,18,18,18), wins = c(0,2,1,0,0,2,0,1))
da1
player wins
1 120 0
2 120 2
3 120 1
4 47 0
5 47 0
6 18 2
7 18 0
8 18 1
我希望它看起来像这样:
da2 <- data.frame(player = c(1,1,1,2,2,3,3,3), wins = c(0,2,1,0,0,2,0,1))
da2
player wins
1 1 0
2 1 2
3 1 1
4 2 0
5 2 0
6 3 2
7 3 0
8 3 1
我试过下面的代码,但它为每个用户创建了一个序列。
library(tidyverse)
da1 %>%
group_by(id) %>%
mutate(start = 1:n())
我认为 tidyverse
解决方案类似于:
da1$player <-
da1 %>%
group_by(player) %>%
group_indices()
如果您愿意考虑 data.table
并且您的数据已经订购,您可以这样做:
da1$player <- data.table::rleid(da1$player)
> da1
player wins
1 1 0
2 1 2
3 1 1
4 2 0
5 2 0
6 3 2
7 3 0
8 3 1
或一路data.table
解(对顺序不敏感):
setDT(da1)[, player := .GRP, by = player]
da1
另一个base R
备选方案:
as.integer(factor(-da1$player))
da2 <- transform(da1, id=match(player, unique(player)))