gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:20:03 25 4
gpt4 key购买 nike

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





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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com