在R中创建合成用户数据;生成用户标识符变量时出现的问题
我正在尝试生成综合用户事件日志数据以供演示。这将是非常基本的功能(总共大约4个变量)。以下是我到目前为止的情况:-在R中创建合成用户数据;生成用户标识符变量时出现的问题,r,string,dataframe,events,random,R,String,Dataframe,Events,Random,我正在尝试生成综合用户事件日志数据以供演示。这将是非常基本的功能(总共大约4个变量)。以下是我到目前为止的情况:- require(wakefield)#for generating the Status variable require(dplyr) require(stringi) set.seed(1) #data<-data.frame() eventDate<-seq(as.Date("2015-01-01"), as.Date("2015
require(wakefield)#for generating the Status variable
require(dplyr)
require(stringi)
set.seed(1)
#data<-data.frame()
eventDate<-seq(as.Date("2015-01-01"), as.Date("2015-12-31"), by = "1 day")
eventDate<-sample(rep(eventDate,each=1000),replace = T)
u <- runif(length(eventDate), 0, 60*60*12) # "noise" to add or subtract from some timepoint
eventDateTime<-as.POSIXlt(u, origin = paste0(eventDate,"00:00:00"))
eventDateTime
eventOutcome<-r_sample_factor(x = c("Passed", "Failed", "Ongoing","Unknown"), n=length(eventDate))
eventOutcome
data<-data.frame(eventDate,eventDateTime,eventOutcome)
head(data)
# eventDate eventDateTime eventOutcome
#1 2015-01-25 2015-01-25 04:48:47 Unknown
#2 2015-05-05 2015-05-05 09:35:22 Unknown
#3 2015-11-28 2015-11-28 08:56:16 Failed
#4 2015-05-23 2015-05-23 02:24:52 Ongoing
#5 2015-01-26 2015-01-26 07:43:52 Failed
#6 2015-10-22 2015-10-22 03:07:14 Passed
require(wakefield)#用于生成状态变量
需要(dplyr)
要求(stringi)
种子(1)
#数据一个选项可能是为每个用户生成UUID。UUID如下所示:
c7f2dde5-dfeb-45cb-9720-87b23effd45d
如果您使用一个好的UUID生成器,那么几乎不可能多次生成相同的UUID。R有一个uuid
包,可用于:
库(uuid)
用户uuid一个选项可能是为每个用户生成一个uuid。UUID如下所示:
c7f2dde5-dfeb-45cb-9720-87b23effd45d
如果您使用一个好的UUID生成器,那么几乎不可能多次生成相同的UUID。R有一个uuid
包,可用于:
库(uuid)
user_uuid您正在生成1300个字符串,但数据中的行数为365000。因此,您可以使用sample
随机重复这些字符串
library(stringi)
data$UserId <- sample(stri_rand_strings(1300,6), nrow(data), replace = TRUE)
库(stringi)
data$UserId您正在生成1300个字符串,但数据中的行数为365000。因此,您可以使用sample
随机重复这些字符串
library(stringi)
data$UserId <- sample(stri_rand_strings(1300,6), nrow(data), replace = TRUE)
库(stringi)
data$UserId听起来您正在寻找的用户id的分布类似于幂律或幂律。这是一种生成对遵循幂律的每个用户ID进行采样的相对概率向量的方法,然后根据这些相对概率对用户ID进行采样
这里我使用函数Pareto::rPareto
来生成相对概率。您可以改变参数,尤其是alpha
,以获得不同的分布。随着alpha
的增加,分布将变得更加均匀。我还提供了一个truncation
参数,这样您就不会有太多用户购买数量过高(在本例中,最常见的ID大约有3700个案例)
注意,您不能保证使用这种特殊的方法对1300个用户ID中的每个ID至少采样一次
接下来,我使用函数uuid::UUIDgenerate
生成1300个唯一字符串。最后,我使用sample
对唯一ID进行采样,并替换数据框中的行。我在样本中绘制了不同ID的频率。同样,如果您不需要此分布,请修改参数
library(Pareto)
library(uuid)
library(ggplot2)
set.seed(1)
n_users <- 1300
n_rows <- 365000
relative_probs <- rPareto(n = n_users, t = 1, alpha = 0.3, truncation = 500)
unique_ids <- UUIDgenerate(n = n_users)
id_sample <- sample(unique_ids, size = n_rows, prob = relative_probs, replace = TRUE)
# Check the distribution of IDs
ggplot(as.data.frame(table(id_sample)), aes(x = Freq)) +
geom_histogram() +
scale_x_log10()
库(帕累托)
图书馆(uuid)
图书馆(GG2)
种子(1)
n_users听起来您正在寻找的用户ID的分布类似于幂律或幂律。这是一种生成对遵循幂律的每个用户ID进行采样的相对概率向量的方法,然后根据这些相对概率对用户ID进行采样
这里我使用函数Pareto::rPareto
来生成相对概率。您可以改变参数,尤其是alpha
,以获得不同的分布。随着alpha
的增加,分布将变得更加均匀。我还提供了一个truncation
参数,这样您就不会有太多用户购买数量过高(在本例中,最常见的ID大约有3700个案例)
注意,您不能保证使用这种特殊的方法对1300个用户ID中的每个ID至少采样一次
接下来,我使用函数uuid::UUIDgenerate
生成1300个唯一字符串。最后,我使用sample
对唯一ID进行采样,并替换数据框中的行。我在样本中绘制了不同ID的频率。同样,如果您不需要此分布,请修改参数
library(Pareto)
library(uuid)
library(ggplot2)
set.seed(1)
n_users <- 1300
n_rows <- 365000
relative_probs <- rPareto(n = n_users, t = 1, alpha = 0.3, truncation = 500)
unique_ids <- UUIDgenerate(n = n_users)
id_sample <- sample(unique_ids, size = n_rows, prob = relative_probs, replace = TRUE)
# Check the distribution of IDs
ggplot(as.data.frame(table(id_sample)), aes(x = Freq)) +
geom_histogram() +
scale_x_log10()
库(帕累托)
图书馆(uuid)
图书馆(GG2)
种子(1)
n_用户你好Ronak,感谢您的快速回复。这可以很好地生成ID变量。我想知道是否有一种方法可以使分布在每个ID上的行数更加可变。例如,一组用户只有几行归属于他们,而另一组用户的行数超过几行?我希望这是有意义的sample
hasprob
参数,您可以定义每个值发生的概率。尽管为1300个值定义概率并不简单。除此之外,没有简单的方法可以控制每个ID的随机性。您需要制定规则来检查和丢弃不符合这些标准的值,并再次为它们生成ID。嗨,Ronak,感谢您的快速响应。这可以很好地生成ID变量。我想知道是否有一种方法可以使分布在每个ID上的行数更加可变。例如,一组用户只有几行归属于他们,而另一组用户的行数超过几行?我希望这是有意义的sample
hasprob
参数,您可以定义每个值发生的概率。尽管为1300个值定义概率并不简单。除此之外,没有简单的方法可以控制每个ID的随机性。你需要制定规则来检查并丢弃不符合这些标准的值,然后再次为它们生成ID。嗨,Tim,谢谢你的回答。它用于创建用户标识符变量。我想知道是否有一种方法可以使它在每个用户id之间的行分布方式上更加可变?例如,一组用户只有很少的交互,而其他用户则有更多的交互,即几十次/数百次?@Robin,但这听起来好像标识符不是真正随机的。是的,我明白你的意思。我希望这种方式类似于零售网站上的购买事件日志,