行式for循环的效率和purrr实现

行式for循环的效率和purrr实现,r,R,我根据与观察I的关系,为每一行按不同的子集过滤数据帧。具体地说,观察到它的日期比观察i的数据早一定的天数。 用for循环解决了这个问题,但没有找到purrr的实现。行式解决方案帖子似乎可以处理更简单的问题 1.有purrr的解决方案吗? 2.代码是否能更有效 我已经用for循环和使用package foreach的并行计算解决了这个问题。 数据如下: 每一行都是一笔信息丰富的贷款(240k次观察)。一些借款人得到经纪人的帮助。 我在统计每个地理区域,每次观察前100天经纪贷款的比例。 (这一比例

我根据与观察I的关系,为每一行按不同的子集过滤数据帧。具体地说,观察到它的日期比观察i的数据早一定的天数。 用for循环解决了这个问题,但没有找到purrr的实现。行式解决方案帖子似乎可以处理更简单的问题

1.有purrr的解决方案吗?
2.代码是否能更有效

我已经用for循环和使用package foreach的并行计算解决了这个问题。
数据如下:
每一行都是一笔信息丰富的贷款(240k次观察)。一些借款人得到经纪人的帮助。 我在统计每个地理区域,每次观察前100天经纪贷款的比例。 (这一比例将成为选择经纪人的选择偏差问题的工具)

#定义玩具数据----

n这似乎是过滤条件的交叉连接。如果您要查看
data.table
,请查看非等联接

这不是100%相同,没有匹配条件的ID不会结转。这可以通过反连接和绑定行轻松解决

你的方法在我的电脑上花了大约20秒。此方法大约需要1秒

df%>%
  inner_join(df, by = 'area')%>%
  filter(date.y < date.x
         , date.y >= date.x - 100)%>%
  group_by(id.x, broker.x, date.x, area)%>%
  summarize(n_area_date = n()
            , sum_broker = sum(broker.y)
            , p_broker = sum_broker / n_area_date)

嗨,我的建议是为purrr编写代码,然后用future_map(来自Furr PackageHank you Cole)替换map(未来_map),处理我的240k观测数据,有2500个统计区域,输出为23M行。我没想到我的电脑能处理这个问题,所以我甚至没有朝这个方向想。你的拆分方法可能仍然有用。这样可以限制为每个交叉联接生成的行数。如果我记得的话,您的数据集在10000个相对较小的样本集上产生了1000万行。
df%>%
  inner_join(df, by = 'area')%>%
  filter(date.y < date.x
         , date.y >= date.x - 100)%>%
  group_by(id.x, broker.x, date.x, area)%>%
  summarize(n_area_date = n()
            , sum_broker = sum(broker.y)
            , p_broker = sum_broker / n_area_date)
dt[, .(area, date, broker)
   ][dt[, .(area, date, l_date = date - 100, id, broker)]
     ,on = .(area = area
             , date < date
             , date >= l_date)
     , .(id, i.broker, i.date, i.area, x.broker)
     , allow.cartesian = T
     ][, .(n_area_date = .N
           , sum_broker = sum(x.broker)
           , p_broker = sum(x.broker) / .N)
       , by = .(id, i.broker, i.date, i.area)]
Unit: milliseconds
                expr        min         lq       mean     median         uq       max neval
 dplyr_non_equi_join   781.3828   802.5404   837.2033   810.3655   847.3634  1032.001    10
         dt_non_equi   121.0912   125.1777   137.7371   138.7682   141.9835   175.763    10
            original 19986.1950 20047.2880 20356.4174 20160.2137 20900.4362 21097.170    10