基于 R 中的字段的运行计数

Posted

技术标签:

【中文标题】基于 R 中的字段的运行计数【英文标题】:Running count based on field in R 【发布时间】:2015-09-24 10:21:01 【问题描述】:

我有一个这种格式的数据集

User       
1 
2
3
2
3
1  
1      

现在我想添加一个计数列来计算用户的出现次数。我想要以下格式的输出。

User    Count
1       1
2       1 
3       1
2       2
3       2
1       2
1       3

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

Running count variable in R

我的 data.frame 现在有 100,000 行,很快它可能会增加到 100 万行。我需要一个也很快的解决方案。

【问题讨论】:

【参考方案1】:

使用aveseq.int 相当容易:

> ave(User,User, FUN= seq.int)
[1] 1 1 1 2 2 2 3

这是一种常见的策略,通常在项目彼此相邻时使用。第二个参数是分组变量,在这种情况下,第一个参数实际上是一种虚拟参数,因为它唯一的贡献是一个长度,ave 不需要为确定的值具有相邻行在分组内。

【讨论】:

【参考方案2】:

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

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

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

as.data.table(mydf)[, count := seq(.N), by = "User"][]

【讨论】:

【参考方案3】:

一个使用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

使用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

【讨论】:

以上是关于基于 R 中的字段的运行计数的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中创建一个运行计数变量?

运行MongoDB查询以更新循环中的序列字段

计算 SQL 中日期字段的计数和运行总计

如何使用 R 正确比较科学计数法中的数字? [复制]

每个时间间隔的事件分组和计数,加上运行总数

使用Liquid将+1计数动态传递给zendesk中的票证字段