【发布时间】:2017-02-27 17:06:44
【问题描述】:
我一直致力于根据唯一值和非唯一值在两个大型数据表(每个大约 2500 万条记录)之间匹配值。我昨天发布了一个问题on how to update values in a data.table using another data.table,答案让我想知道如何提高这种匹配的效率。在我的示例中,dt1 包含一个非唯一的区号和一个可以从 1 到 10 的类型(以及一些空白列)。 dt2 包含相同的非唯一区号(尽管与dt1 中的数字不同)、从 1 到 10 的类型和唯一 ID (U_ID)。
我想做的是在dt1 和dt2 中找到匹配的AREA_CD 和TYPE 行,并将这些行的U_ID 从dt2 复制到dt1。问题是 dt1 和 dt2 每个唯一组合的实例数量不同。例如 AREA_CD 'A1' 和 TYPE '1' 在 dt1 中出现 21 次,而在 dt2 中仅出现 20 次。在这些情况下,最小行数(在这种情况下为 20)将应用匹配操作,使 dt1 中的 1 行保持不变(如果 dt2 的行数多于 dt1,则 @987654340 中的行数@ 将被使用)。
这是我的数据集的一个示例。我的实际数据集有大约 25,000,000 行,包含大约 10,000 个独特的区域和从 1 到 10 的类型。
require("data.table")
df1 <-data.frame(AREA_CD = c(rep("A1", 205), rep("A2", 145), rep("A3", 250), rep("A4", 100), rep("A5", 300)), TYPE = rep(1:10), ALLOCATED = 0, U_ID = 0, ID_CD = c(1:1000))
df1$ID_CD <- interaction( "ID", df1$ID_CD, sep = "")
df2 <-data.frame(U_ID = c(1:1000), AREA_CD = c(rep("A1", 200), rep("A2", 155), rep("A3", 245), rep("A4", 90), rep("A5", 310)), TYPE = rep(1:10), ASSIGNED = 0)
df2$U_ID <- interaction( "U", df2$U_ID, sep = "")
dt1 <- as.data.table(df1)
dt2 <- as.data.table(df2)
我正在寻找的输出看起来像这样:
for(o in 1:5){
Ao <- paste("A",o,sep="")
for(i in 1:10){
R.Num <- min(nrow(with(df1, df1[AREA_CD == Ao & TYPE == i ,])), nrow(with(df2, df2[AREA_CD == Ao & TYPE == i ,])))
df1[df1$AREA_CD == Ao & df1$TYPE == i,][1:R.Num,"U_ID"] <- as.character(df2[df2$AREA_CD == Ao & df2$TYPE == i,][1:R.Num,"U_ID"])
}}
我希望这是有道理的。
【问题讨论】:
标签: r data.table