首页 > 解决方案 > 每个主题的单一 ID - tidyverse

问题描述

我正在尝试为我的数据集中的每个主题创建一个 ID。基本上,我想要一个列,只要它是主题 A,它的值就是 1,只要它是主题,它就是 2,等等。

数据如下所示:

Subject <- as.factor(c(rep("A", 8), rep("B", 4), rep("C", 12)))
variable.A <- rnorm(mean = 300, sd = 50, n = Subject)
dat <- data.frame(Subject, variable.A)
dat 

   Subject variable.A
1        A   345.2206
2        A   308.3600
3        A   355.9006
4        A   286.2234
5        A   216.0149
6        A   204.1322
7        A   333.5757
8        A   225.2777
9        B   351.0208
10       B   184.0209
11       B   297.5687
12       B   370.6719
13       C   385.4616
14       C   257.3872
15       C   313.9441
16       C   311.0300
17       C   275.4909
18       C   349.2425
19       C   251.2615
20       C   358.9317
21       C   360.2139
22       C   341.3104
23       C   344.5236
24       C   257.9959

我在想我可以使用seq_along(),但这只是计算每个主题的观察结果:

library(tidyverse)

dat <- dat %>%
        group_by(Subject) %>%
        mutate(index = seq_along(Subject))

dat %>% as.data.frame()

   Subject variable.A index
1        A   345.2206     1
2        A   308.3600     2
3        A   355.9006     3
4        A   286.2234     4
5        A   216.0149     5
6        A   204.1322     6
7        A   333.5757     7
8        A   225.2777     8
9        B   351.0208     1
10       B   184.0209     2
11       B   297.5687     3
12       B   370.6719     4
13       C   385.4616     1
14       C   257.3872     2
15       C   313.9441     3
16       C   311.0300     4
17       C   275.4909     5
18       C   349.2425     6
19       C   251.2615     7
20       C   358.9317     8
21       C   360.2139     9
22       C   341.3104    10
23       C   344.5236    11
24       C   257.9959    12

标签: rtidyverse

解决方案


data.table另一种选择是.GRP

library(data.table)
setDT(dat)[,  index := .GRP, Subject]

或与match

library(dplyr)
dat %>% 
  mutate(index = match(Subject, unique(Subject)))

推荐阅读