基于R中的字段运行计数

Gug*_*han 8 r running-total

我有这种格式的数据集

User       
1 
2
3
2
3
1  
1      
Run Code Online (Sandbox Code Playgroud)

现在我想添加一个列计数,用于计算用户的出现次数.我希望以下格式输出.

User    Count
1       1
2       1 
3       1
2       2
3       2
1       2
1       3
Run Code Online (Sandbox Code Playgroud)

我的解决方案很少,但所有这些解决方案都有点慢.

在R中运行计数变量

我的data.frame现在有100,000行,很快就可能达到100万行.我需要一个快速的解决方案.

akr*_*run 8

一个选项使用 dplyr

 library(dplyr)
 df1 %>%
      group_by(User) %>%
      mutate(Count=row_number())
 #    User Count
 #1    1     1
 #2    2     1
 #3    3     1
 #4    2     2
 #5    3     2
 #6    1     2
 #7    1     3
Run Code Online (Sandbox Code Playgroud)

运用 sqldf

library(sqldf)
sqldf('select a.*, 
           count(*) as Count
           from df1 a, df1 b
           where a.User = b.User and b.rowid <= a.rowid
           group by a.rowid')
#   User Count
#1    1     1
#2    2     1
#3    3     1
#4    2     2
#5    3     2
#6    1     2
#7    1     3
Run Code Online (Sandbox Code Playgroud)


42-*_*42- 6

这很容易aveseq.int:

> ave(User,User, FUN= seq.int)
[1] 1 1 1 2 2 2 3
Run Code Online (Sandbox Code Playgroud)

这是一种常见的策略,通常在物品彼此相邻时使用.第二个参数是分组变量,在这种情况下,第一个参数实际上是一种伪参数,因为它贡献的唯一内容是长度,并且不需要ave在分组中确定值的相邻行.


A5C*_*2T1 5

您可以getanID从我的“splitstackshape”包中使用:

library(splitstackshape)
getanID(mydf, "User")
##    User .id
## 1:    1   1
## 2:    2   1
## 3:    3   1
## 4:    2   2
## 5:    3   2
## 6:    1   2
## 7:    1   3
Run Code Online (Sandbox Code Playgroud)

这本质上是一种使用“data.table”的方法,如下所示:

as.data.table(mydf)[, count := seq(.N), by = "User"][]
Run Code Online (Sandbox Code Playgroud)