这个问题在这里已经有了答案:
Numbering rows within groups in a data frame
(9 个回答)
3年前关闭。
我的实际数据集由每个 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
我正在尝试按顺序编号
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
你会怎么做?我试图选择每个
id
的最后一行通过使用 duplicated()
,但这可能不是方法,因为它适用于整个列。
最佳答案
使用 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
如果您有大型数据集或正在使用
data.table
包,您可以使用“.N
”,如下所示:library(data.table)
DT <- data.table(dat)
DT[, s := 1:.N, by = "id"]
## Or
## DT[, s := sequence(.N), id][]
或者,您可以使用
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
为了完整起见,这里是“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
关于r - 在许多不等长的行 block 内顺序编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14294948/