计算R

时间:2016-07-12 17:07:04

标签: 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     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

2 个答案:

答案 0 :(得分:2)

如果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

答案 1 :(得分:1)

另一个基础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

给出:

> 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

使用data.table的解决方案:

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

给出:

> 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开发版本中的data.table函数:

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