r - 在数据帧: index in group (not unique between groups)中创建一个新列

标签 r grouping data.table

我有一个包含两列的数据框:第一列包含每个人所属的组,第二列包含个人的 ID。见下文:

df <- data.frame( group=c('G1','G1','G1','G1','G2','G2','G2','G2'), 
      indiv=c('indiv1','indiv1','indiv2','indiv2','indiv3',
              'indiv3','indiv4','indiv4'))

   group   indiv
1     G1  indiv1
2     G1  indiv1
3     G1  indiv2
4     G1  indiv2
5     G2  indiv3
6     G2  indiv3
7     G2  indiv4
8     G2  indiv4

我想在我的数据框中创建一个新列(保留长格式),其中包含组中每个人的索引,即:

   group   indiv  Ineed
1     G1  indiv1      1
2     G1  indiv1      1
3     G1  indiv2      2
4     G1  indiv2      2
5     G2  indiv3      1
6     G2  indiv3      1
7     G2  indiv4      2
8     G2  indiv4      2

我尝试过使用 data.table .N 或 .GRP 方法,但没有成功(顺便说一句,在 data.table 上做得很好!)。

非常感谢任何帮助!

最佳答案

您可以在此处使用新的 rleid 函数(从开发版本 v >= 1.9.5 开始)

setDT(df)[, Ineed := rleid(indiv), group][]
#    group  indiv Ineed
# 1:    G1 indiv1     1
# 2:    G1 indiv1     1
# 3:    G1 indiv2     2
# 4:    G1 indiv2     2
# 5:    G2 indiv3     1
# 6:    G2 indiv3     1
# 7:    G2 indiv4     2
# 8:    G2 indiv4     2

或者您可以转换为因子(以便创建唯一的组),然后将它们转换回数字(如果您使用 CRAN 稳定版本 v <= 1.9.4)

setDT(df)[, Ineed := as.numeric(factor(indiv)), group][]
#    group  indiv Ineed
# 1:    G1 indiv1     1
# 2:    G1 indiv1     1
# 3:    G1 indiv2     2
# 4:    G1 indiv2     2
# 5:    G2 indiv3     1
# 6:    G2 indiv3     1
# 7:    G2 indiv4     2
# 8:    G2 indiv4     2

关于r - 在数据帧: index in group (not unique between groups)中创建一个新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27959280/

相关文章:

mysql - 如何使用 R 打开压缩的 mySQL 数据表

python - 如何根据共享项目有效地分组对?

R data.table条件和: Cleaner way

r - 从单个表中查找多列

r - 如何根据权重复制观察结果

r - 设置网格中轴标签的格式

linux - R 在 Fedora 中安装在哪里?

css - 使用 rvest 从 CSS 中抓取标题属性

android - 如何将 hdpi、mdpi、ldpi 和 xhdpi 文件保存在 Android Assets 文件夹中?

list - Dart组中的项目列表变成了不同的数据结构?