r - 在许多不等长的行 block 内顺序编号

标签 r

这个问题在这里已经有了答案:





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/

相关文章:

r - 绘制 R : keep categorical column names, 但不绘制它们

python - 如何使用 6 组绘制维恩图

r - 调整地 block 之间的距离

r - 在 R markdown 中批量创建文档

r - 在 R 中索引嵌套列表

r - 创建可执行 R 文件

r - geom_smooth 中的自定义 lm 公式

r - 在 Rmd YAML 中使用 `list.files()` 作为引用书目字段

r - 如何重新缩放 R 中直方图的 Y 轴(频率)?

r - 如何在 R 中使用字符串作为代码