首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >第N组标签(只包括有新组别的毕业生)

第N组标签(只包括有新组别的毕业生)
EN

Stack Overflow用户
提问于 2021-10-15 15:12:02
回答 3查看 96关注 0票数 2

比如说,我有一个df

代码语言:javascript
复制
df <- data.table(user = c('a', 'a', 'b')
                 ); df

user
 a
 a
 b

我希望在user级别创建一个新的列,名为user

代码语言:javascript
复制
user group_id
 a        1
 a        1
 b        2

有没有一种快速/可伸缩的方法?我可以用一个join来完成这个任务(并且理解data.table使用join是快速的),但是我想知道是否有一个更简单、更快的方法。假设我有大约1e8行,并且该方法将应用于组中的多个列(例如,这里只有1,即user)

我从以下几个方面开始:

代码语言:javascript
复制
df[, step_1 := as.integer(duplicated(df))]; df

user step_1
 a      0
 a      1
 b      0

但我不知道下一步是什么,我也不确定这是否是正确的方向。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-15 17:46:44

我们也可以使用match

代码语言:javascript
复制
df[, group_id := match(user, unique(user))]
票数 1
EN

Stack Overflow用户

发布于 2021-10-15 16:48:05

data.table的特殊符号.GRP也适用于多个分组列。

代码语言:javascript
复制
df[, group_id := .GRP, by = user][]

用户group_id a 1 a 1 b 2

或者,可以使用rleid()函数,但这要求数据集由相同的列排序:

代码语言:javascript
复制
df[order(user), group_id := rleid(user)][] 

user group\_id 1: a 1 2: a 1 3: b 2

票数 2
EN

Stack Overflow用户

发布于 2021-10-15 15:15:35

将用户转换为因子。然后将其转换为整数,以提取因子使用的底层代码。

代码语言:javascript
复制
df[, group_id := as.integer(factor(user))]
df
##    user group_id
## 1:    a        1
## 2:    a        1
## 3:    b        2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69586920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档