如何在R中按组顺序标记类别?

如何在R中按组顺序标记类别?,r,dplyr,data.table,R,Dplyr,Data.table,这是一个非常简单的问题,但我有以下数据: > head(Session_numbers) ID Session 1 1 1_43392 2 1 1_43392 3 1 1_43392 4 1 1_43394 5 1 1_43394 6 1 1_43394 7 1 1_43398 8 1 1_43401 9 2 2_44502 10 2 2_44502 其中ID是每个主题的分组标签,每行都有一个会话代码,对应于时间点。我想在变量“Snum”中按

这是一个非常简单的问题,但我有以下数据:

> head(Session_numbers)
   ID Session 
1  1 1_43392 
2  1 1_43392 
3  1 1_43392 
4  1 1_43394 
5  1 1_43394 
6  1 1_43394 
7  1 1_43398 
8  1 1_43401 
9  2 2_44502 
10 2 2_44502 
其中ID是每个主题的分组标签,每行都有一个会话代码,对应于时间点。我想在变量“Snum”中按顺序对会话代码进行编号,以便每个ID的每个相同会话代码都被分组并获得相同的编号,例如:

   ID Session Snum
1  1 1_43392 1
2  1 1_43392 1
3  1 1_43392 1
4  1 1_43394 2
5  1 1_43394 2
6  1 1_43394 2
7  1 1_43398 3
8  1 1_43401 4
9  2 2_44502 1
10 2 2_44502 1
每个ID的会话数不同,每个会话代码都是唯一的

我曾尝试使用
ave
dplyr
data.table
,但似乎无法正确使用,例如:

 DT <- data.table(Session_numbers)
 DT[, Snum := seq_len(.N), by = list(ID, Session)]

 > head(DT)
    ID Session Snum
 1:  1 1_43392    1
 2:  1 1_43392    2
 3:  1 1_43392    3
 4:  1 1_43394    1
 5:  1 1_43394    2
 6:  1 1_43394    3
或使用
ave

head(Session_numbers)
  ID Session num
1  1 1_43392   1
2  1 1_43392   2
3  1 1_43392   3
4  1 1_43394   1
5  1 1_43394   2
6  1 1_43394   3
我的问题与此类似:


我遗漏了什么?

这里有一个选项,我们根据“ID”分组,并将“Session”与“Session”的
唯一元素匹配,以获得索引

library(dplyr) 
Session_numbers %>%
  group_by(ID) %>%
  mutate(num = match(Session, unique(Session)))
# A tibble: 10 x 3
# Groups:   ID [2]
#      ID Session   num
#   <int> <chr>   <int>
# 1     1 1_43392     1
# 2     1 1_43392     1
# 3     1 1_43392     1
# 4     1 1_43394     2
# 5     1 1_43394     2
# 6     1 1_43394     2
# 7     1 1_43398     3
# 8     1 1_43401     4
# 9     2 2_44502     1
#10     2 2_44502     1
如果我们有兴趣将非相邻元素更改为新的编号,那么

library(data.table)
...
 %>% mutate(num = rleid(Session))
数据
Session\u number另一个
dplyr
选项可以是:

df %>%
 group_by(ID) %>%
 mutate(Snum = cumsum(!duplicated(Session)))

      ID Session  Snum
   <int> <chr>   <int>
 1     1 1_43392     1
 2     1 1_43392     1
 3     1 1_43392     1
 4     1 1_43394     2
 5     1 1_43394     2
 6     1 1_43394     2
 7     1 1_43398     3
 8     1 1_43401     4
 9     2 2_44502     1
10     2 2_44502     1
df%>%
分组依据(ID)%>%
变异(Snum=cumsum(!重复(会话)))
ID会话Snum
1     1 1_43392     1
2     1 1_43392     1
3     1 1_43392     1
4     1 1_43394     2
5     1 1_43394     2
6     1 1_43394     2
7     1 1_43398     3
8     1 1_43401     4
9     2 2_44502     1
10     2 2_44502     1

感谢您的快速回复!我试图复制这一点,但我现在看到的是,每个编号都在不断增加,如下面的输出所示。这是使用精确的dplyr代码并生成新数据。我不知道为什么一个tible:10x3#组:ID[2]ID会话编号*1 1 1_43392 1 2 1_43392 1 3 1_43392 1 1_43394 2 6 1_43394 2 7 1_43398 3 8 1_434014 9 2 2_44502 5 10 2_445025@Clarius333从评论中不清楚。我复制了你的数据,做了一个可复制的example@Clarius333我使用了
packageVersion('dplyr')#[1]'0.8.3'>packageVersion('rlang')[1]'0.4.0'
我缺少包'rlang'。。。非常感谢你!
packageVersion('dplyr')
您显示的错误对meMy来说是不可复制的
dplyr
包是
packageVersion('dplyr')[1]“0.8.3'
,安装
rlang
后,我在安装
dplyr
时再也不会出现此错误,它应该已自动安装,不知道为什么
rlang
没有安装。不管怎样,现在一切都好了。
library(data.table)
...
 %>% mutate(num = rleid(Session))
Session_numbers <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L), 
    Session = c("1_43392", "1_43392", "1_43392", "1_43394", "1_43394", 
    "1_43394", "1_43398", "1_43401", "2_44502", "2_44502")), 
    class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))
df %>%
 group_by(ID) %>%
 mutate(Snum = cumsum(!duplicated(Session)))

      ID Session  Snum
   <int> <chr>   <int>
 1     1 1_43392     1
 2     1 1_43392     1
 3     1 1_43392     1
 4     1 1_43394     2
 5     1 1_43394     2
 6     1 1_43394     2
 7     1 1_43398     3
 8     1 1_43401     4
 9     2 2_44502     1
10     2 2_44502     1