R Data.table:在不同的数据子集上动态创建变量,并按变量x分组,对最终结果进行分组

R Data.table:在不同的数据子集上动态创建变量,并按变量x分组,对最终结果进行分组,r,data.table,R,Data.table,我在多个时间段内为数据中的单个客户ID创建三种类型的变量。这些新变量包括价格向量的总和、价格向量的平均值以及日期向量中连续日期之间的平均差 使用data.table,我在多个时间段中循环,对每个时间段中的数据进行子集,并计算各个客户ID的变量。这些变量中的每一个都被动态命名为I循环。目前,这些变量的计算是正确的 这就是我陷入困境的地方:在计算完所有这些变量之后,我想将数据子集,以包括新的聚合变量以及每个客户的最新purchase.price和date元素 我认为data.table可能会在每个客

我在多个时间段内为数据中的单个客户ID创建三种类型的变量。这些新变量包括价格向量的总和、价格向量的平均值以及日期向量中连续日期之间的平均差

使用data.table,我在多个时间段中循环,对每个时间段中的数据进行子集,并计算各个客户ID的变量。这些变量中的每一个都被动态命名为I循环。目前,这些变量的计算是正确的

这就是我陷入困境的地方:在计算完所有这些变量之后,我想将数据子集,以包括新的聚合变量以及每个客户的最新purchase.price和date元素

我认为data.table可能会在每个客户对应的所有行上复制计算出的总计。但是,它仅在与表的i索引中指定的期间间隔相对应的行中复制这些总计。因为它不会在每个客户的所有行上复制这些总数,所以我的最后一个dplyr块并没有做到这一点

在第二个和第三个代码块中,我将给出最终dplyr代码的输出,然后给出我想要实现的输出

这个问题源于我们所处的类似问题

库(lubridate)
库(数据表)
图书馆(dplyr)

数据我们可以像上一篇文章一样使用
Map

nm1 <- sprintf("%s.%d.%s", "period", seq_along(period_intervals), "price.sum")
nm2 <- sprintf("%s.%d.%s", "period", seq_along(period_intervals), "price.mean")
nm3 <- sprintf("%s.%d.%s", "period", seq_along(period_intervals), "mean.diff.date")
data[,   c(rbind(nm1, nm2, nm3)) := unlist(Map(function(x,y) {
         x1 <- purchase.price[x %within% y]
         list(sum(x1), mean(x1), mean(as.numeric(diff(x1))))},
                   list(date), period_intervals), recursive = FALSE), by = custid]
data[order(custid, -date)][,.SD[1] , custid]

nm1看起来很棒!我想知道为什么周期3中客户1的平均日期差为NaN。查看
cust1\u period3%过滤器(custid==1&date%,在%period\u interval[[3]]内)%>%mutate(period.3.mean.diff.date=mean(as.numeric(diff(date)))
返回平均日期差1?@toddyong我想列名得到了interchanged@ToddYoung您在帖子中的代码是
diff(purchase.price)
这里的注释是
diff(date)
。我在关注你的帖子。否则,我觉得很好。我不太明白你的意思。如果我们复制原始数据示例并将其称为“data.check”,然后运行
cust1\u period3%filter(custid==1&date%在%period\u interval[[3]])%>%mutate(period.3.mean.diff.date=mean(as.numeric(diff(date)))
,这可能是我调用原始数据集“data”的错误,结果给出了客户1=1的日期平均差。这能解决问题吗?天哪,你说得对。那是个打字错误。有了这些,一切都按预期进行。
  custid purchase.price       date period.1.price.sum period.1.price.mean period.1.mean.diff.date period.2.price.sum ...
   <dbl>          <dbl>     <date>              <dbl>              <dbl>                   <dbl>              <dbl> ...
1      2            199 2015-04-10                 NA                 NA                      NA                 NA ...
2      1            149 2015-03-16                 NA                 NA                      NA                 NA ...
      custid purchase.price       date period.1.price.sum period.1.price.mean period.1.mean.diff.date period.2.price.sum ...
       <dbl>          <dbl>     <date>              <dbl>              <dbl>                   <dbl>              <dbl> ...
    1      2            199 2015-04-10                625                 25                       2                981 ...
    2      1            149 2015-03-16                275                 55                       2                1539 ...
nm1 <- sprintf("%s.%d.%s", "period", seq_along(period_intervals), "price.sum")
nm2 <- sprintf("%s.%d.%s", "period", seq_along(period_intervals), "price.mean")
nm3 <- sprintf("%s.%d.%s", "period", seq_along(period_intervals), "mean.diff.date")
data[,   c(rbind(nm1, nm2, nm3)) := unlist(Map(function(x,y) {
         x1 <- purchase.price[x %within% y]
         list(sum(x1), mean(x1), mean(as.numeric(diff(x1))))},
                   list(date), period_intervals), recursive = FALSE), by = custid]
data[order(custid, -date)][,.SD[1] , custid]