我正在尝试将一些原始数据重组为更紧凑的形式。当前,数据看起来像R代码的以下输出。我希望最终输出中包含时间,ID和所有可能的期望价格的列。然后,我希望每个ID每次仅具有一行,并以不同的期望价格(因此,在这段时间内ID需要多少价格)输入数量。因此,例如,一个特定的ID可能有100的数量1和101的数量2。如果是买入,则值应为负,如果是卖出,则应为正。例如,-1表示100的买入,2表示101的卖出。
我最初尝试通过double for循环进行操作,第一个循环是时间,第二个循环是ID。然后,我可以查看数量列和ID的期望价格,并将它们放入向量中。之后,我将所有矢量合并在一起,然后重复一次。当我尝试在实践中使用它时,这是不可行的,因为代码太慢了,因为有数百个ID和数千次。有人可以帮我更快更清洁的方式吗?
set.seed(1)
time <- rep(seq(1,5), , each = 15)
id <- sample(342:450,75,replace = TRUE)
price <- sample(99:103,75,replace = TRUE)
Desire.Price <- sample(97:105,75,replace = TRUE)
quantity <- sample(1:4,75,replace = TRUE)
data <- data.frame(time = time, id = id,price = price, Desire.Price = Desire.Price,quantity = quantity)
data$buysell <- 0
data$buysell <- ifelse( data$Desire.Price <= data$price, "BUY","SELL")
我希望最终数据集看起来像这样。
Final.df <- data.frame(time=NA,id=NA,"97" = NA,"98"=NA ,"99"=NA,"100"=NA,"101"=NA,"102"=NA,"103"=NA
,"104"=NA,"105"=NA)
基本上,它会压缩原始原始数据,以在每个时间段内连续获取特定ID的所有信息。
编辑:如果一个ID在那个时间没有被采样(例如ID 342不是在时间1中),那么在那个时间段他们应该有一个NA行(所以ID 342在时间1中会有一个NA行)。我对生成样本的代码进行了编辑,使其具有更多ID来反映这一点(这样就不可能在每个时间段都对它们进行抽样)。
这是一种整理方法。首先,根据“买/卖”对数量进行签名,然后将每个id /时间/Desire.Price的数量相加,然后将其分散为宽格式,并为每个Desire.Price设置一列。
library(dplyr); library(tidyr)
data %>%
mutate(quantity_signed = if_else(buysell == "BUY", -quantity, quantity)) %>%
count(id, time, Desire.Price, wt = quantity_signed) %>%
complete(id, time) %>% # EDIT to bring in all times for all id's
spread(Desire.Price, n) %>% View("output")
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句