首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于特殊标准的加速合并数据帧

基于特殊标准的加速合并数据帧
EN

Stack Overflow用户
提问于 2016-02-05 14:49:35
回答 1查看 41关注 0票数 0

我得到了两个数据框,结构(列)如下:

代码语言:javascript
复制
Price ["CID","Startdate","Enddate","P1","P2"] 

Usage ["Date","Hour","CID","Value"]

我正在尝试将价格与使用合并。我想要'Usage‘中的P1和Date值,方法是在'Price’中检查相应的'CID‘和’P2‘值

下面是我的R代码:

代码语言:javascript
复制
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:使用

代码语言:javascript
复制
["Date","Hour","CID","Value","P1","P2"]

这个逻辑works.But我想增加速度歧管(6-10倍)。任何帮助都会提前appreciated.Thanks很多。

EN

回答 1

Stack Overflow用户

发布于 2016-02-05 17:52:38

data.table太棒了。

首先:下一次,请提供一些示例数据,以说明您的数据实际是什么样子。它有助于了解一个人可以使用哪些附加信息。我自己做了一个样品,请看看我是否或多或少做对了。

代码语言:javascript
复制
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

所以这就是你的交易:

代码语言:javascript
复制
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中,对于CIDDateUsage中的每个组合,只有一行。

有关更多信息,请查看data.table文档,因为这可能会毁了这篇文章。

玩得开心!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35217938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档