总结附近的观察

时间:2019-07-24 22:17:59

标签: r dplyr matching

我有一个很大的data.frame,其中包含商品价格和每个价格售出的数量。我想查找以与每行价格相似(在一定范围内)的价格出售的商品总数。例如,对于第j个观察(行),我想查找价格低于Price_j + 50且高于Price_j-50的已售商品数量总和,对于其他观察也是如此。

我可以对观察值运行一个for循环,并为每个观察值的价格过滤数据。

df<-data.frame(Price = runif(100)*100 , Q = runif(100)*1000)
SumQ = data.frame()
for (i in c(1:nrow(df))){
  df_filterd <- df %>% filter(Price < Price[i]+50 & Price > Price[i]-50)%>% summarize(sumQ = sum(Q))
  SumQ<-rbind(SumQ, df_filterd$sumQ) 
}

有没有更有效的方法?我有一个很大的数据集,并且花大量时间在所有观察结果上运行for循环。

2 个答案:

答案 0 :(得分:2)

您要避免循环和绑定结果-这将非常慢。相反,请尝试:

with(df, sapply(Price, function(x) sum(Q[Price < x+50 & Price > x-50])))

答案 1 :(得分:1)

或者使用dplyrpurrr,您可以

df %>% mutate(sumQ = map_dbl(Price,
                             ~sum(Q[Price < .+50 & Price > .-50])))

         Price          Q     sumQ
1    5.2272345 284.433416 28356.80
2   17.7292069 454.122990 35459.90
3    9.7329295 509.266254 29989.69
4   68.1042808 131.169813 41230.23
5   38.5612268 938.653962 45227.63
6   44.5808938 774.296761 47758.30
...