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