我的实际数据集由每个数据集的重复测量组成id,其中测量数量可能因人而异.一个简单的例子是:
dat <- data.frame(id = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L))
dat
## id
## 1 1
## 2 1
## 3 1
## 4 1
## 5 1
## 6 1
## 7 2
## 8 2
## 9 3
## 10 3
## 11 3
Run Code Online (Sandbox Code Playgroud)
我试图按变量顺序编号dat行id.结果应该是:
dat
## id s
## 1 1 1
## 2 1 2
## 3 1 3
## 4 1 4
## 5 1 5
## 6 1 6
## 7 2 1
## 8 2 2
## 9 3 1
## 10 3 2
## 11 3 3
Run Code Online (Sandbox Code Playgroud)
你会怎么做?我试图id通过使用选择每一行的最后一行duplicated(),但这可能不是这样,因为它适用于整个列.
A5C*_*2T1 10
使用ave().第一项是您要将该功能应用于的项目; 其他项是您的分组变量,FUN是您要应用的功能.有关?ave详细信息,请参阅
transform(dat, s = ave(id, id, FUN = seq_along))
# id s
# 1 1 1
# 2 1 2
# 3 1 3
# 4 1 4
# 5 1 5
# 6 1 6
# 7 2 1
# 8 2 2
# 9 3 1
# 10 3 2
# 11 3 3
Run Code Online (Sandbox Code Playgroud)
如果您有一个大型数据集或正在使用该data.table包,您可以使用" .N"如下:
library(data.table)
DT <- data.table(dat)
DT[, s := 1:.N, by = "id"]
## Or
## DT[, s := sequence(.N), id][]
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用rowid,像这样:
library(data.table)
setDT(dat)[, s := rowid(id)][]
# id s
# 1: 1 1
# 2: 1 2
# 3: 1 3
# 4: 1 4
# 5: 1 5
# 6: 1 6
# 7: 2 1
# 8: 2 2
# 9: 3 1
# 10: 3 2
# 11: 3 3
Run Code Online (Sandbox Code Playgroud)
为了完整起见,这里是"tidyverse"方法:
library(tidyverse)
dat %>%
group_by(id) %>%
mutate(s = row_number(id))
## # A tibble: 11 x 2
## # Groups: id [3]
## id s
## <int> <int>
## 1 1 1
## 2 1 2
## 3 1 3
## 4 1 4
## 5 1 5
## 6 1 6
## 7 2 1
## 8 2 2
## 9 3 1
## 10 3 2
## 11 3 3
Run Code Online (Sandbox Code Playgroud)