【问题标题】:Identifier as sequence starting with 1 [duplicate]标识符作为以 1 开头的序列 [重复]
【发布时间】:2019-10-07 13:47:49
【问题描述】:

我的数据集中有一个 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())

【问题讨论】:

  • match(da1$player, unique(da1$player))

标签: r dplyr transform sequence identifier


【解决方案1】:

我相信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))

【讨论】:

    【解决方案2】:
    da2 <- transform(da1, id=match(player, unique(player)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 2015-11-30
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多