R 有没有更有效的搜索算法

R 有没有更有效的搜索算法,r,algorithm,R,Algorithm,我正试图根据两个标准在R中将两个数据集合并在一起。他们必须有相同的身份证和年份。其中一个矢量大小约为10000,另一个为2000。我想如果我做两级一级的搜索,计算时间就会爆炸。数据按id和年份排序。有没有比单纯的比较更有效的搜索算法 这个问题有很多解决方案,例如通过合并、索引、循环(如您所说) 然而,最优雅的解决方案是使用data.table包,它管理数据集的速度非常快,可以认为是data.frame的一个改进版本 让我们首先设置数据:根据您在问题中提供的有限信息,这里是一个解决问题的虚拟尝试

我正试图根据两个标准在R中将两个数据集合并在一起。他们必须有相同的身份证和年份。其中一个矢量大小约为10000,另一个为2000。我想如果我做两级一级的搜索,计算时间就会爆炸。数据按id和年份排序。有没有比单纯的比较更有效的搜索算法

这个问题有很多解决方案,例如通过合并、索引、循环(如您所说)

然而,最优雅的解决方案是使用
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)
第二步:合并任何你想要的方式

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)  
希望这有帮助


如果没有,请发布更多详细信息

这个问题有很多解决方案,例如通过合并、索引、循环(如您所说)

然而,最优雅的解决方案是使用
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)
第二步:合并任何你想要的方式

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)  
希望这有帮助


如果没有,请发布更多详细信息

这个问题有很多解决方案,例如通过合并、索引、循环(如您所说)

然而,最优雅的解决方案是使用
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)
第二步:合并任何你想要的方式

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)  
希望这有帮助


如果没有,请发布更多详细信息

这个问题有很多解决方案,例如通过合并、索引、循环(如您所说)

然而,最优雅的解决方案是使用
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)
第二步:合并任何你想要的方式

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)  
希望这有帮助



如果没有,请发布更多详细信息

对。它是按id和年份排序的。我已经编辑了这个问题。请注意,对于计算机来说,10k和2k是相对较小的数字。所以,这里的爆炸意味着大约1毫秒或者其他什么(当然是非常相对的,但你明白我的意思了)?因为它是经过排序的,所以当事情不匹配时,您可以向前跳过。您是否尝试过
merge
?有4个向量。两年和两个id向量。所以会有2000^10000*2个比较。我不确定我是否正确思考了这个问题。好吧,从每个数据集中发布一些样本,这样我们可以看得更清楚。是的。它是按id和年份排序的。我已经编辑了这个问题。请注意,对于计算机来说,10k和2k是相对较小的数字。所以,这里的爆炸意味着大约1毫秒或者其他什么(当然是非常相对的,但你明白我的意思了)?因为它是经过排序的,所以当事情不匹配时,您可以向前跳过。您是否尝试过
merge
?有4个向量。两年和两个id向量。所以会有2000^10000*2个比较。我不确定我是否正确思考了这个问题。好吧,从每个数据集中发布一些样本,这样我们可以看得更清楚。是的。它是按id和年份排序的。我已经编辑了这个问题。请注意,对于计算机来说,10k和2k是相对较小的数字。所以,这里的爆炸意味着大约1毫秒或者其他什么(当然是非常相对的,但你明白我的意思了)?因为它是经过排序的,所以当事情不匹配时,您可以向前跳过。您是否尝试过
merge
?有4个向量。两年和两个id向量。所以会有2000^10000*2个比较。我不确定我是否正确思考了这个问题。好吧,从每个数据集中发布一些样本,这样我们可以看得更清楚。是的。它是按id和年份排序的。我已经编辑了这个问题。请注意,对于计算机来说,10k和2k是相对较小的数字。所以,这里的爆炸意味着大约1毫秒或者其他什么(当然是非常相对的,但你明白我的意思了)?因为它是经过排序的,所以当事情不匹配时,您可以向前跳过。您是否尝试过
merge
?有4个向量。两年和两个id向量。所以会有2000^10000*2个比较。我不确定我是否正确思考了这个问题。好吧,从每个数据集中发布一些示例,这样我们可以看得更清楚。感谢您提到data.table包。我发现这是data.frame helpfu的简介。显然,data.table使用二进制搜索而不是向量扫描。所以速度要快得多。确切地还有另外两本好书。试试:
vignette(“datatable常见问题”)
vignette(“datatable timings”)
@YanSong,可能有助于回答有关
数据表和二进制搜索的一些问题。@Shambho,+1。如“data.frame的演化版本”的定义;