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

标签 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 是每个主题的分组标签,每行都有一个 session 代码,对应于时间点。我想在变量“Snum”中对 session 代码按顺序编号,以便每个 ID 的每个相同 session 代码都被分组并给出相同的编号,例如:

   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的 session 数不同,并且每个 session 代码都是唯一的。

我尝试使用 avedplyrdata.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

或者使用dplyr,使用以下代码会给出错误消息:

> Session_numbers %>%
 +   group_by(ID, Session) %>%
 +   mutate(Snum = row_number())
 Error: row_number() should only be called in a data context
 Call `rlang::last_error()` to see a backtrace

或与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

我的问题与此类似:Count number of observations/rows per group and add result to data frame

我错过了什么?

最佳答案

这是一个选项,我们按“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

或者使用基础R

Session_numbers$num <- with(Session_numbers, ave(Session, ID, FUN = 
              function(x) match(x, unique(x))))

如果我们有兴趣将不相邻的元素更改为新数字,则

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"))

关于r - 如何在 R 中按组顺序标记类别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58735437/

相关文章:

r - 为什么 R stringdist 在 q-gram 距离中返回 Inf,其中一个字符串比 q 短?

r - 将数学函数翻译成 R

r - 使用 tidyverse 创建一个以恒定速率增加的列

r - dplyr 中基于 Shiny 输入的条件过滤器

按组回归

r - 求多边形外接圆的半径

r - 如何将条件面板设置为 Shiny 的选择输入?

r - Dplyr 多重滞后整洁评估?

r - R 中的百分位数结果与 MS Excel 不匹配

r - 选择所有列 |基于条件的 data.table 的行