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