在R中计数重复项

在R中计数重复项,r,R,我想知道,如何能够制作一个新的变量来计算我在特定年份中有多少个ID副本。例如,下面我想计算2014年之前重复该ID的次数。这样,在2015年,2013年和2014年的ID都在计算中 ID Term Year Repeats 122 L 2013 N/A 112 L 2013 N/A 002 L 2013 N/A 152 L 2013 N/A 124 L 2013

我想知道,如何能够制作一个新的变量来计算我在特定年份中有多少个ID副本。例如,下面我想计算2014年之前重复该ID的次数。这样,在2015年,2013年和2014年的ID都在计算中

ID   Term   Year    Repeats
122   L      2013     N/A
112   L      2013     N/A   
002   L      2013     N/A   
152   L      2013     N/A
124   L      2013     N/A
122   L      2014     1
102   L      2014     N/A
142   L      2014     N/A
152   L      2014     N/A
120   L      2014     N/A
198   L      2014     N/A
122   L      2015     2
012   L      2015     N/A
101   L      2015     N/A
092   L      2015     N/A
031   L      2015     N/A

如果
年份
按升序排列:

df$Repeats <- 0L
i <- which(duplicated(df$ID))
df$Repeats[i] <- with(df[i, ], unsplit(lapply(split(ID, ID), seq_along), ID))
df
#    ID Term Year Repeats
#1  122    L 2013       0
#2  112    L 2013       0
#3    2    L 2013       0
#4  152    L 2013       0
#5  124    L 2013       0
#6  122    L 2014       1
#7  102    L 2014       0
#8  142    L 2014       0
#9  152    L 2014       1
#10 120    L 2014       0
#11 198    L 2014       0
#12 122    L 2015       2
#13  12    L 2015       0
#14 101    L 2015       0
#15  92    L 2015       0
#16  31    L 2015       0

df$重复如果
Year
按升序排列:

df$Repeats <- 0L
i <- which(duplicated(df$ID))
df$Repeats[i] <- with(df[i, ], unsplit(lapply(split(ID, ID), seq_along), ID))
df
#    ID Term Year Repeats
#1  122    L 2013       0
#2  112    L 2013       0
#3    2    L 2013       0
#4  152    L 2013       0
#5  124    L 2013       0
#6  122    L 2014       1
#7  102    L 2014       0
#8  142    L 2014       0
#9  152    L 2014       1
#10 120    L 2014       0
#11 198    L 2014       0
#12 122    L 2015       2
#13  12    L 2015       0
#14 101    L 2015       0
#15  92    L 2015       0
#16  31    L 2015       0

df$重复另一个基本R解决方案:

d$Repeats <- ave(d$ID, d$ID, FUN = function(x) seq_along(x)-1)

# or a bit cleaner (thx to @DavidArenburg):
d$Repeats <- with(d, ave(ID, ID, FUN = seq_along)) - 1
使用
数据的解决方案。表

library(data.table)
setDT(d, key = c('ID','Year'))
d[, Repeats := 0:(.N-1), by = ID]
d[, Repeats := rowid(ID)-1]
其中:

> d
    ID Term Year Repeats
1  122    L 2013       0
2  112    L 2013       0
3    2    L 2013       0
4  152    L 2013       0
5  124    L 2013       0
6  122    L 2014       1
7  102    L 2014       0
8  142    L 2014       0
9  152    L 2014       1
10 120    L 2014       0
11 198    L 2014       0
12 122    L 2015       2
13  12    L 2015       0
14 101    L 2015       0
15  92    L 2015       0
16  31    L 2015       0
> d
     ID Term Year Repeats
 1:   2    L 2013       0
 2:  12    L 2015       0
 3:  31    L 2015       0
 4:  92    L 2015       0
 5: 101    L 2015       0
 6: 102    L 2014       0
 7: 112    L 2013       0
 8: 120    L 2014       0
 9: 122    L 2013       0
10: 122    L 2014       1
11: 122    L 2015       2
12: 124    L 2013       0
13: 142    L 2014       0
14: 152    L 2013       0
15: 152    L 2014       1
16: 198    L 2014       0
或者,您可以使用
数据开发版本中的
rowid
功能。表

library(data.table)
setDT(d, key = c('ID','Year'))
d[, Repeats := 0:(.N-1), by = ID]
d[, Repeats := rowid(ID)-1]

使用
dplyr

library(dplyr)
d %>% group_by(ID) %>% mutate(Repeats = row_number()-1)

如果您想要
NA
,而不是零,您可以使用:

d[, Repeats := c(NA, 1:(.N-1)), by = ID]
这将提供:

    ID Term Year Repeats
 1:   2    L 2013      NA
 2:  12    L 2015      NA
 3:  31    L 2015      NA
 4:  92    L 2015      NA
 5: 101    L 2015      NA
 6: 102    L 2014      NA
 7: 112    L 2013      NA
 8: 120    L 2014      NA
 9: 122    L 2013      NA
10: 122    L 2014       1
11: 122    L 2015       2
12: 124    L 2013      NA
13: 142    L 2014      NA
14: 152    L 2013      NA
15: 152    L 2014       1
16: 198    L 2014      NA

另一个基本的R解决方案:

d$Repeats <- ave(d$ID, d$ID, FUN = function(x) seq_along(x)-1)

# or a bit cleaner (thx to @DavidArenburg):
d$Repeats <- with(d, ave(ID, ID, FUN = seq_along)) - 1
使用
数据的解决方案。表

library(data.table)
setDT(d, key = c('ID','Year'))
d[, Repeats := 0:(.N-1), by = ID]
d[, Repeats := rowid(ID)-1]
其中:

> d
    ID Term Year Repeats
1  122    L 2013       0
2  112    L 2013       0
3    2    L 2013       0
4  152    L 2013       0
5  124    L 2013       0
6  122    L 2014       1
7  102    L 2014       0
8  142    L 2014       0
9  152    L 2014       1
10 120    L 2014       0
11 198    L 2014       0
12 122    L 2015       2
13  12    L 2015       0
14 101    L 2015       0
15  92    L 2015       0
16  31    L 2015       0
> d
     ID Term Year Repeats
 1:   2    L 2013       0
 2:  12    L 2015       0
 3:  31    L 2015       0
 4:  92    L 2015       0
 5: 101    L 2015       0
 6: 102    L 2014       0
 7: 112    L 2013       0
 8: 120    L 2014       0
 9: 122    L 2013       0
10: 122    L 2014       1
11: 122    L 2015       2
12: 124    L 2013       0
13: 142    L 2014       0
14: 152    L 2013       0
15: 152    L 2014       1
16: 198    L 2014       0
或者,您可以使用
数据开发版本中的
rowid
功能。表

library(data.table)
setDT(d, key = c('ID','Year'))
d[, Repeats := 0:(.N-1), by = ID]
d[, Repeats := rowid(ID)-1]

使用
dplyr

library(dplyr)
d %>% group_by(ID) %>% mutate(Repeats = row_number()-1)

如果您想要
NA
,而不是零,您可以使用:

d[, Repeats := c(NA, 1:(.N-1)), by = ID]
这将提供:

    ID Term Year Repeats
 1:   2    L 2013      NA
 2:  12    L 2015      NA
 3:  31    L 2015      NA
 4:  92    L 2015      NA
 5: 101    L 2015      NA
 6: 102    L 2014      NA
 7: 112    L 2013      NA
 8: 120    L 2014      NA
 9: 122    L 2013      NA
10: 122    L 2014       1
11: 122    L 2015       2
12: 124    L 2013      NA
13: 142    L 2014      NA
14: 152    L 2013      NA
15: 152    L 2014       1
16: 198    L 2014      NA

最好是
dput
示例数据或提供创建它的R代码,以便希望帮助您的人可以快速将数据复制到他们自己的R会话中。最好是
dput
示例数据或提供创建它的R代码,因此,希望帮助您的人可以快速将您的数据复制到他们自己的R会话中