我有一个很大的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循环。
答案 0 :(得分:2)
您要避免循环和绑定结果-这将非常慢。相反,请尝试:
with(df, sapply(Price, function(x) sum(Q[Price < x+50 & Price > x-50])))
答案 1 :(得分:1)
或者使用dplyr
和purrr
,您可以
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
...