我试图根据两个标准将两个数据集合并在一起。他们必须拥有相同的身份和年份。其中一个向量大小约为10000,另一个大小为2000.我认为如果我逐个进行两级搜索,计算时间就会爆炸。数据按id和年份排序。是否有比天真比较更有效的搜索算法?
答案 0 :(得分:3)
这个问题有很多解决方案,例如通过合并,通过索引,通过循环(如你所说)。
但是,最优雅的解决方案是使用data.table
包,这对于管理数据集非常快,可以被视为data.frame
的进化版本。
让我们首先设置数据:根据您在问题中提供的有限信息,这是一个解决问题的虚拟尝试。
install.packages("data.table")
library(data.table)
set.seed(100)
dt1 <- data.table(
id = 1:10000,
Year = sample(1950:2014,size=10000,replace = TRUE),
v1 = runif(10000)
)
head(dt1)
dt2 <- data.table(
id = sample(1:10000,2000),
Year = sample(1950:2014,size=2000,replace = TRUE),
v2 = runif(2000),
v3 = runif(2000)
)
head(dt2)
设置数据后,剩下的部分非常简单。
步骤1:设置键。
setkey(dt1,id,Year) # Set keys in first table
setkey(dt2,id,Year) # Set keys in second table
Step2:合并你想要的任何方式。
dt1[dt2,nomatch=0]
dt2[dt1,nomatch=0]
合并数据所需的时间约为0.02秒。对于非常大的数据集,这也非常快。
system.time(dt1[dt2,nomatch=0]) # 0.02 sec
system.time(dt2[dt1,nomatch=0]) # 0.02 sec
要了解有关data.table的更多信息
?example(data.table)
希望这会有所帮助!!
如果没有,请发布更多细节!!