按R中的组计算上一个项目的数量

按R中的组计算上一个项目的数量,r,counting,R,Counting,我想创建一个新的变量,它统计分组中以前项目的数量。以下是我的意思,以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

我想创建一个新的变量,它统计分组中以前项目的数量。以下是我的意思,以
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
...
如何计算此列


谢谢

可以使用专门的软件包,如
dplyr
,其中包含
row\u number()
。我们需要按变量('alcgp')分组,并使用
mutate
创建一个新列

library(dplyr)
df1 %>%
   group_by( alcgp) %>%
   mutate(indx= row_number())
或者使用
base R
中的
ave
。我们按“alcgp”分组,在
FUN
中,我们可以指定
顺序。我使用了
seq_-along(alcgp)
,因为如果变量是
factor
class,它可能不起作用

 df1$indx <- with(df1, ave(seq_along(alcgp), alcgp, FUN=seq_along))

下面是一个
数据表
解决方案:

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

库(data.table)
##

数据重复的某种类型和大约1MM相似questions@DavidArenburg在第一个列表中,它是列标题中的
rank
,在第二个列表中,它是
counter
,而不是
count
:-)
 library(splitstackshape)
 getanID(df1, 'alcgp')
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
)