在 R 中按组计算先前项目的数量
Count the number previous items in by group in R
我想创建一个新变量来计算分组中先前项目的数量。我的意思是这样的,以esoph
数据集为例。
首先,我按组 esoph$agegp, esoph$alcgp
和附加值列 -esoph$ncontrols
.
对数据集进行排序
这给了我以下数据集
x<-esoph[order(esoph$agegp, esoph$alcgp, -esoph$ncontrols ), ]
x
agegp alcgp tobgp ncases ncontrols
1 25-34 0-39g/day 0-9g/day 0 40
2 25-34 0-39g/day 10-19 0 10
3 25-34 0-39g/day 20-29 0 6
4 25-34 0-39g/day 30+ 0 5
5 25-34 40-79 0-9g/day 0 27
6 25-34 40-79 10-19 0 7
8 25-34 40-79 30+ 0 7
7 25-34 40-79 20-29 0 4
9 25-34 80-119 0-9g/day 0 2
11 25-34 80-119 30+ 0 2
...
现在,我想创建一个带有某种索引的新变量,每行增加一个。每当下一个分组开始时,索引就会回到 1。
结果 table 如下(带有附加索引列):
agegp alcgp tobgp ncases ncontrols index
1 25-34 0-39g/day 0-9g/day 0 40 1
2 25-34 0-39g/day 10-19 0 10 2
3 25-34 0-39g/day 20-29 0 6 3
4 25-34 0-39g/day 30+ 0 5 4
5 25-34 40-79 0-9g/day 0 27 1
6 25-34 40-79 10-19 0 7 2
8 25-34 40-79 30+ 0 7 3
7 25-34 40-79 20-29 0 4 4
9 25-34 80-119 0-9g/day 0 2 1
11 25-34 80-119 30+ 0 2 2
...
如何计算此列?
谢谢!
这可以使用专门的软件包来实现,例如 dplyr
中有 row_number()
。我们需要按变量 ('alcgp') 分组并使用 mutate
.
创建一个新列
library(dplyr)
df1 %>%
group_by( alcgp) %>%
mutate(indx= row_number())
或使用 base R
中的 ave
。我们按 'alcgp' 分组,在 FUN
中我们可以指定 seq_along
。我使用 seq_along(alcgp)
因为如果变量是 factor
class.
它可能不起作用
df1$indx <- with(df1, ave(seq_along(alcgp), alcgp, FUN=seq_along))
splitstackshape
中的另一个方便的功能,即 getanID
library(splitstackshape)
getanID(df1, 'alcgp')
这是一个 data.table
解决方案:
R> (data.table(Data)[,index := 1:.N, by = "agegp,alcgp"])
agegp alcgp tobgp ncases ncontrols index
1: 25-34 0-39g/day 0-9g/day 0 40 1
2: 25-34 0-39g/day 10-19 0 10 2
3: 25-34 0-39g/day 20-29 0 6 3
4: 25-34 0-39g/day 30+ 0 5 4
5: 25-34 40-79 0-9g/day 0 27 1
6: 25-34 40-79 10-19 0 7 2
7: 25-34 40-79 30+ 0 7 3
8: 25-34 40-79 20-29 0 4 4
9: 25-34 80-119 0-9g/day 0 2 1
10: 25-34 80-119 30+ 0 2 2
library(data.table)
##
Data <- read.table(
text = " agegp alcgp tobgp ncases ncontrols
1 25-34 0-39g/day 0-9g/day 0 40
2 25-34 0-39g/day 10-19 0 10
3 25-34 0-39g/day 20-29 0 6
4 25-34 0-39g/day 30+ 0 5
5 25-34 40-79 0-9g/day 0 27
6 25-34 40-79 10-19 0 7
8 25-34 40-79 30+ 0 7
7 25-34 40-79 20-29 0 4
9 25-34 80-119 0-9g/day 0 2
11 25-34 80-119 30+ 0 2",
header = TRUE,
stringsAsFactors = FALSE
)
我想创建一个新变量来计算分组中先前项目的数量。我的意思是这样的,以esoph
数据集为例。
首先,我按组 esoph$agegp, esoph$alcgp
和附加值列 -esoph$ncontrols
.
这给了我以下数据集
x<-esoph[order(esoph$agegp, esoph$alcgp, -esoph$ncontrols ), ]
x
agegp alcgp tobgp ncases ncontrols
1 25-34 0-39g/day 0-9g/day 0 40
2 25-34 0-39g/day 10-19 0 10
3 25-34 0-39g/day 20-29 0 6
4 25-34 0-39g/day 30+ 0 5
5 25-34 40-79 0-9g/day 0 27
6 25-34 40-79 10-19 0 7
8 25-34 40-79 30+ 0 7
7 25-34 40-79 20-29 0 4
9 25-34 80-119 0-9g/day 0 2
11 25-34 80-119 30+ 0 2
...
现在,我想创建一个带有某种索引的新变量,每行增加一个。每当下一个分组开始时,索引就会回到 1。
结果 table 如下(带有附加索引列):
agegp alcgp tobgp ncases ncontrols index
1 25-34 0-39g/day 0-9g/day 0 40 1
2 25-34 0-39g/day 10-19 0 10 2
3 25-34 0-39g/day 20-29 0 6 3
4 25-34 0-39g/day 30+ 0 5 4
5 25-34 40-79 0-9g/day 0 27 1
6 25-34 40-79 10-19 0 7 2
8 25-34 40-79 30+ 0 7 3
7 25-34 40-79 20-29 0 4 4
9 25-34 80-119 0-9g/day 0 2 1
11 25-34 80-119 30+ 0 2 2
...
如何计算此列?
谢谢!
这可以使用专门的软件包来实现,例如 dplyr
中有 row_number()
。我们需要按变量 ('alcgp') 分组并使用 mutate
.
library(dplyr)
df1 %>%
group_by( alcgp) %>%
mutate(indx= row_number())
或使用 base R
中的 ave
。我们按 'alcgp' 分组,在 FUN
中我们可以指定 seq_along
。我使用 seq_along(alcgp)
因为如果变量是 factor
class.
df1$indx <- with(df1, ave(seq_along(alcgp), alcgp, FUN=seq_along))
splitstackshape
中的另一个方便的功能,即 getanID
library(splitstackshape)
getanID(df1, 'alcgp')
这是一个 data.table
解决方案:
R> (data.table(Data)[,index := 1:.N, by = "agegp,alcgp"])
agegp alcgp tobgp ncases ncontrols index
1: 25-34 0-39g/day 0-9g/day 0 40 1
2: 25-34 0-39g/day 10-19 0 10 2
3: 25-34 0-39g/day 20-29 0 6 3
4: 25-34 0-39g/day 30+ 0 5 4
5: 25-34 40-79 0-9g/day 0 27 1
6: 25-34 40-79 10-19 0 7 2
7: 25-34 40-79 30+ 0 7 3
8: 25-34 40-79 20-29 0 4 4
9: 25-34 80-119 0-9g/day 0 2 1
10: 25-34 80-119 30+ 0 2 2
library(data.table)
##
Data <- read.table(
text = " agegp alcgp tobgp ncases ncontrols
1 25-34 0-39g/day 0-9g/day 0 40
2 25-34 0-39g/day 10-19 0 10
3 25-34 0-39g/day 20-29 0 6
4 25-34 0-39g/day 30+ 0 5
5 25-34 40-79 0-9g/day 0 27
6 25-34 40-79 10-19 0 7
8 25-34 40-79 30+ 0 7
7 25-34 40-79 20-29 0 4
9 25-34 80-119 0-9g/day 0 2
11 25-34 80-119 30+ 0 2",
header = TRUE,
stringsAsFactors = FALSE
)