添加一列,总结 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
这里而是 mutate
。 summarise
将根据您分组所依据的列的不同值为您提供一行,而 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
我开始对移动应用程序进行数据挖掘, 我有一个看起来像这样的数据库:
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_distictlibrary("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
这里而是 mutate
。 summarise
将根据您分组所依据的列的不同值为您提供一行,而 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