循环以统计R中每个用户在一个时间段内的事件
这里是初学者R用户。我正在使用data.frame(df1),其中包含研究日期和执行研究的用户。数据如下所示:循环以统计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
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