R 基于假数据集的总和值创建单个行

R 基于假数据集的总和值创建单个行,r,R,我正在创建一个假数据集,并希望从本质上分解一个总和,以创建可以填充随机日期的虚拟行 例如,我的df可能如下所示: id orders skips joe 3 0 mary 2 1 jack 5 1 我想生成的是一个data.frame或data.table如下所示,其中成功的order是1,跳过是0: id order joe 1 joe 1 joe 1 mary 1 mary 0 mary 1 jack 1

我正在创建一个假数据集,并希望从本质上分解一个总和,以创建可以填充随机日期的虚拟行

例如,我的
df
可能如下所示:

id    orders   skips
joe   3        0
mary  2        1
jack  5        1
我想生成的是一个
data.frame
data.table
如下所示,其中成功的
order
1
,跳过是
0

id    order
joe   1
joe   1
joe   1
mary  1
mary  0
mary  1
jack  1
jack  1
jack  1
jack  1
jack  0
jack  1
添加:理想情况下,如果可能,
0
值将随机混合/夹在
1
值之间。这是由于数据集在问题集中的用途有点奇怪

在一个完美的世界中,我会从给定的范围为
id
中的每个订单分配一个随机的
开始日期,这样:

id    order  date
joe   1     1/2/2016
joe   1     1/3/2016
joe   1     1/8/2016
mary  1     1/10/2016
mary  0     1/3/2016
mary  1     1/5/2016
jack  1     1/7/2016
jack  1     1/2/2016
jack  1     1/1/2016
jack  1     1/10/2016
jack  0     1/12/2016
jack  1     1/15/2016
我最初认为我可以结合使用
dcast
重塑
来欺骗R生成数据集,例如
dcast(df,id~orders,fun.aggregate=length)
,但这让我走错了路


但是,在他们爬行之前,必须先走路。有人能帮忙吗?

这里有一种方法可以处理
数据。表

dt[, .(order = rep(c(1, 0), c(orders, skips))), by = "id"]
#      id order
#1:   joe     1
#2:   joe     1
#3:   joe     1
#4:  mary     1
#5:  mary     1
#6:  mary     0
#7:  jack     1
#8:  jack     1
#9:  jack     1
#10: jack     1
#11: jack     1
#12: jack     0

数据:

library(data.table)
dt <- fread(
  "id    orders   skips
  joe   3        0
  mary  2        1
  jack  5        1"
)
库(data.table)

dt以下是一种使用
数据的方法。表

dt[, .(order = rep(c(1, 0), c(orders, skips))), by = "id"]
#      id order
#1:   joe     1
#2:   joe     1
#3:   joe     1
#4:  mary     1
#5:  mary     1
#6:  mary     0
#7:  jack     1
#8:  jack     1
#9:  jack     1
#10: jack     1
#11: jack     1
#12: jack     0

数据:

library(data.table)
dt <- fread(
  "id    orders   skips
  joe   3        0
  mary  2        1
  jack  5        1"
)
库(data.table)

dt您可以使用
tapply
(或者
split
lapply
,如果您愿意的话)在基本R中执行,然后
rbind
将所有内容重新组合在一起:

df2 <- do.call(rbind, tapply(df, df$id, 
                             function(x){
                                 data.frame(id = rep(x$id, sum(x$orders, x$skips)), 
                                            order = sample(rep(c(1, 0), c(x$orders, x$skips)))
                                 )
                             }))
rownames(df2) <- NULL

您可以在基本R中使用
taply
(或者
split
lappy
,如果愿意的话)然后
rbind
将所有内容重新组合在一起:

df2 <- do.call(rbind, tapply(df, df$id, 
                             function(x){
                                 data.frame(id = rep(x$id, sum(x$orders, x$skips)), 
                                            order = sample(rep(c(1, 0), c(x$orders, x$skips)))
                                 )
                             }))
rownames(df2) <- NULL

@josliber我添加了一些我的想法(
dcast
重塑
),但我不想让任何人陷入一个我知道是错误的兔子洞。希望这有帮助
x@josliber我添加了一些我的想法(
dcast
重塑
),但我不想让任何人陷入一个我知道是错误的兔子洞。希望这有帮助<代码>x现在不在我的问题中(我将返回并编辑),但您是否有任何想法,我可以如何使其尽可能使0位于中间行?e、 例如,第6行将是第5行。这是假数据集将用于解决的问题的一个怪癖。我现在的问题不是(我将返回并编辑),但您是否有任何想法,我可以如何使0尽可能位于中间行?e、 例如,第6行将是第5行。这是假数据集将用于的问题的一个怪癖。