比如说,我有一个df
df <- data.table(user = c('a', 'a', 'b')
); df
user
a
a
b我希望在user级别创建一个新的列,名为user:
user group_id
a 1
a 1
b 2有没有一种快速/可伸缩的方法?我可以用一个join来完成这个任务(并且理解data.table使用join是快速的),但是我想知道是否有一个更简单、更快的方法。假设我有大约1e8行,并且该方法将应用于组中的多个列(例如,这里只有1,即user)
我从以下几个方面开始:
df[, step_1 := as.integer(duplicated(df))]; df
user step_1
a 0
a 1
b 0但我不知道下一步是什么,我也不确定这是否是正确的方向。谢谢。
发布于 2021-10-15 17:46:44
我们也可以使用match
df[, group_id := match(user, unique(user))]发布于 2021-10-15 16:48:05
data.table的特殊符号.GRP也适用于多个分组列。
df[, group_id := .GRP, by = user][]用户group_id a 1 a 1 b 2
或者,可以使用rleid()函数,但这要求数据集由相同的列排序:
df[order(user), group_id := rleid(user)][] user group\_id 1: a 1 2: a 1 3: b 2
发布于 2021-10-15 15:15:35
将用户转换为因子。然后将其转换为整数,以提取因子使用的底层代码。
df[, group_id := as.integer(factor(user))]
df
## user group_id
## 1: a 1
## 2: a 1
## 3: b 2https://stackoverflow.com/questions/69586920
复制相似问题