我得到了两个数据框,结构(列)如下:
Price ["CID","Startdate","Enddate","P1","P2"]
Usage ["Date","Hour","CID","Value"]我正在尝试将价格与使用合并。我想要'Usage‘中的P1和Date值,方法是在'Price’中检查相应的'CID‘和’P2‘值
下面是我的R代码:
t_cid=Price$CID
Startdate=Price$Startdate
Enddate=Price$Enddate
fv <-function(x){
p<-Price[ (t_cid==x[3]) & (x[1] >=Startdate ) &(x[1] <=Enddate),c("P1","P2")]
return(list(p))
}
t1=Sys.time()
k=unlist(apply(Usage,1,fv))
t2=Sys.time()
print(t2-t1)
v=rep(c(TRUE,FALSE),length(k)/2)
Usage$P1=k[v]
Usage$P2=k[!v]向量v从k中分离P1和P2值
生成的Dataframe:使用
["Date","Hour","CID","Value","P1","P2"]这个逻辑works.But我想增加速度歧管(6-10倍)。任何帮助都会提前appreciated.Thanks很多。
发布于 2016-02-05 17:52:38
data.table太棒了。
首先:下一次,请提供一些示例数据,以说明您的数据实际是什么样子。它有助于了解一个人可以使用哪些附加信息。我自己做了一个样品,请看看我是否或多或少做对了。
Price <- data.table(
CID = rep(c(1, 2), 1, each = 5),
Startdate = rep(seq(Sys.Date(), by = "2 day", length.out = 5), 2),
Enddate = rep(seq(Sys.Date() + 1, by = "2 day", length.out = 5), 2),
P1 = runif(10), P2 = rnorm(10)
)
Usage = data.table(
Date = rep(seq(Sys.Date(), by = "2 day", length.out = 4), 2),
Hour = 6:13,
CID = rep(c(1, 2),2, each = 2),
Value = runif(8)
)请注意,这些已经被定义为data.tables。只需运行dt <- data.table(df)即可从任何data.frame创建data.table
所以这就是你的交易:
Usage[ , P1 := Price[.BY$Date >= Startdate & .BY$Date <= Enddate & CID == .BY$CID, P1], by = c("Date", "CID")]
Usage[ , P2 := Price[.BY$Date >= Startdate & .BY$Date <= Enddate & CID == .BY$CID, P2], by = c("Date", "CID")]所做的假设:在Price中,对于CID和Date在Usage中的每个组合,只有一行。
有关更多信息,请查看data.table文档,因为这可能会毁了这篇文章。
玩得开心!
https://stackoverflow.com/questions/35217938
复制相似问题