【问题标题】:Speed- Up Merging dataframes based on special criteria基于特殊标准加速合并数据帧
【发布时间】:2016-02-05 06:49:34
【问题描述】:

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

Price ["CID","Startdate","Enddate","P1","P2"] 

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

我正在尝试将价格与使用情况合并。通过检查“价格”中相应的“CID”和“日期”值,我希望“使用”中的 P1 和 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 将 P1 和 P2 值与 k 分开

结果数据框:用法

["Date","Hour","CID","Value","P1","P2"]

这个逻辑有效。但我想增加速度流形(6-10 倍)。任何帮助将不胜感激。在此先感谢。

【问题讨论】:

标签: r dataframe


【解决方案1】:

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 &lt;- 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 中只有一行 CIDUsage 中的 Date 的每个组合。

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

玩得开心!

【讨论】:

  • 非常感谢伙计。这正是我想要的! Data.table 真的很酷。我将查看 data.table 文档。
猜你喜欢
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 2018-03-18
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
相关资源
最近更新 更多