循环以统计R中每个用户在一个时间段内的事件

循环以统计R中每个用户在一个时间段内的事件,r,dataframe,loops,dplyr,R,Dataframe,Loops,Dplyr,这里是初学者R用户。我正在使用data.frame(df1),其中包含研究日期和执行研究的用户。数据如下所示: set.seed(42) options(stringsAsFactors=FALSE) df1 <- data.frame(Date=sample(seq(as.Date('2018/01/01'), as.Date('2018/03/01'), by="day"), 10), User=sample(c("Us

这里是初学者R用户。我正在使用data.frame(df1),其中包含研究日期和执行研究的用户。数据如下所示:

set.seed(42)
options(stringsAsFactors=FALSE)
df1 <- data.frame(Date=sample(seq(as.Date('2018/01/01'), as.Date('2018/03/01'), by="day"), 10),
                  User=sample(c("Usr1","Usr2","Usr3"),10,replace=TRUE))
df1
        Date User
1  2018-02-18 Usr3
2  2018-02-06 Usr1
3  2018-01-01 Usr1
4  2018-01-25 Usr2
5  2018-01-10 Usr2
6  2018-02-05 Usr2
7  2018-01-18 Usr3
8  2018-03-01 Usr3
9  2018-02-16 Usr1
10 2018-01-24 Usr1
df2
    Month Usr3 Usr1 Usr2
1 2018-01   1    2    2
2 2018-02   1    2    1
3 2018-03   1    0    0
我假设有一个整洁的dplyr函数,比如tally(),可以很快解决这个问题,但我似乎无法解决它。有什么建议吗


非常感谢

我个人在处理此类数据时,会使用dplyr和lubridate函数的组合。Lubridate包含有用的函数,如month()和year(),它们从日期对象中提取必需的元素

为了计算事件的数量,我将使用group_by来选择我们要计算的组,然后使用count函数对每个组进行计数

我在下面附上了我的代码的reprex。如果有什么我不明白或需要改进的地方,请告诉我

我没有包括的一件事是我创建的月份和年份列之间的连接。(@denis在这方面提供了有用的评论)

库(tidyverse)
图书馆(lubridate)
种子(42)
选项(stringsAsFactors=FALSE)
df1%
#转换为TIBLE(首选项)
TIBLE%>%
#将日期转换为月份和年份,因为它们是唯一必需的组件
#此外,这使得按月分组变得更简单
突变(年=年(日期),月=月(日期,标签=T))%>%
#创建我们想要统计的事物的分组
分组依据(月、年、用户)%>%
#数一数每个小组的成员
计数()%>%
#将数据帧重新排列为所需的格式
pivot\u更宽(名称\u from=User,值\u from=n)
#>#tibble:3 x 5
#>#组:月、年[3]
#>月份年份Usr1 Usr2 Usr3
#>       
#>2018年1月1日2 2 1
#>2018年2月2日2 1
#>2018年3月3日NA 1
由(v2.0.0)Base R选项于2021-04-04创建:

table(transform(df1, Date = format(Date, '%Y-%m')))

#       User
#Date      Usr1 Usr2 Usr3
#  2018-01    2    2    1
#  2018-02    2    1    1
#  2018-03    0    0    1

我真的很喜欢Ronak Shah的答案,因为它是一个简单的短基线R代码。如果您想留在tidyverse中,在创建列的
计数
/
透视
方法旁边还有两个选项

您可以在分组的
summary
调用中使用
purrr::map\u dfc
。您需要设置要首先循环的向量的名称(
unique
用户的值)。然后可以使用
sum(User=.x)
获取
User
的每个实例的计数作为列

另一个选项是上的(免责声明:它是我创建的包的一部分,通过在向量和/或列集合上循环,可以更轻松地创建列)。在这种情况下,您可以在分组的
summary
调用中使用
over
,而不是
map\u dfc

库(dplyr)
图书馆(lubridate)
#地图
图书馆(purrr)
用户\u向量%unique()%%>%设置\u名称(,.)
df1%>%
分组依据(月=格式.日期(ymd(日期),%Y-%m”))%>%
总结(map_dfc(user_vec,~sum(user=.x)))
#>#tibble:3 x 4
#>月份Usr3 Usr1 Usr2
#>        
#> 1 2018-01     1     2     2
#> 2 2018-02     1     2     1
#> 3 2018-03     1     0     0
#结束
图书馆(dplyover)#https://github.com/TimTeaFan/dplyover
df1%>%
分组依据(月=格式.日期(ymd(日期),%Y-%m”))%>%
总结(超过(dist_值(用户),~sum(用户=.x)))
#>#tibble:3 x 4
#>月份Usr1 Usr2 Usr3
#>        
#> 1 2018-01     2     2     1
#> 2 2018-02     2     1     1
#> 3 2018-03     0     0     1
由(v0.3.0)创建于2021-04-05

使用
格式.Date(ymd(df1$Date),%Y-%m”)
来设置OA
月变量
table(transform(df1, Date = format(Date, '%Y-%m')))

#       User
#Date      Usr1 Usr2 Usr3
#  2018-01    2    2    1
#  2018-02    2    1    1
#  2018-03    0    0    1