添加一列,总结 R 中每个用户的会话数

Add a column that sum the number of sessions per user in R

我开始对移动应用程序进行数据挖掘, 我有一个看起来像这样的数据库:

Database
UserId         Hour         Date
01                18           01.01.2016
01                18           01.01.2016
01                14           02.01.2016
01                14           03.01.2016
02                21           03.01.2016
02                08           05.01.2016
02                08           05.01.2016
03                23           05.01.2016

我想向该数据库添加一个新列,用于汇总用户使用该应用程序的不同天数, 在此数据库中,例如 UserId#01 在三天内出现在平台上,

预期的数据结果如下:

Database
UserId         Hour         Date                 NumDates
01                18           01.01.2016        3
01                18           01.01.2016        3
01                14           02.01.2016        3
01                14           03.01.2016        3 
02                21           03.01.2016        2
02                08           05.01.2016        2
02                08           05.01.2016        2
03                23           05.01.2016        1

到目前为止我已经使用了这个命令:

Database["NumDates"] % group_by(UserId) %>% summarise(NumDates = length(unique(Date)))

但它告诉我它只创建了 5000 行(我数据库中不同用户的数量),而我需要 +600,000(我数据库中的会话数)

如果有人能帮助我,将不胜感激!

你可以在 dplyr

中使用 n_distict
library("dplyr")
database<- data.frame(UserId = c(1,1,1,1,2,2,2,3), Hour = c(18,18,14,14,21,8,8,23), Date = c("01.01.2016","01.01.2016","02.01.2016","03.01.2016","03.01.2016","05.01.2016","05.01.2016","05.01.2016"))
database %>% group_by(userId) %>% mutate(NumDates = n_distinct(Date))

结果如下

   UserId  Hour       Date NumDates
    (dbl) (dbl)     (fctr)    (int)
1      1    18 01.01.2016        3
2      1    18 01.01.2016        3
3      1    14 02.01.2016        3
4      1    14 03.01.2016        3
5      2    21 03.01.2016        2
6      2     8 05.01.2016        2
7      2     8 05.01.2016        2
8      3    23 05.01.2016        1

你不想要 summarise 这里而是 mutatesummarise 将根据您分组所依据的列的不同值为您提供一行,而 mutate 只会添加另一列并保留现有列。

我们可以使用 uniqueN 来自 data.table

library(data.table)
setDT(Database)[, NumDates := uniqueN(Date) , by = UserId]
Database
#   UserId Hour       Date NumDates
#1:      1   18 01.01.2016        3
#2:      1   18 01.01.2016        3
#3:      1   14 02.01.2016        3
#4:      1   14 03.01.2016        3
#5:      2   21 03.01.2016        2
#6:      2    8 05.01.2016        2
#7:      2    8 05.01.2016        2
#8:      3   23 05.01.2016        1