使用多列中的值将ID列从一个数据框分配到另一个数据框

时间:2017-01-26 12:37:11

标签: r loops

我有两个长度相同的数据框,它们共享2列具有相同数据的数据框(' CODE'' TYPE')。我需要做的是匹配' CODE'的每个独特组合。和' TYPE'在DF1和DF2中找到,并从DF2到DF1的结果匹配中分配唯一的ID。

我当前的解决方案使用循环函数,虽然它确实有效,但我需要使用它的数据量非常慢。有谁知道如何才能获得同样的结果但更快?下面的示例是我的实际数据的整洁版本。谢谢。

编辑:在示例中,DF1包含50个CODE' M001'其中10个被分配为类型1.在DF2中,还有10个类型1用于CODE' M001'但每个都有一个唯一的ID。这意味着,这些10个唯一ID中的每一个在根据“CODE”进行匹配时同样有效。和' TYPE'值。这意味着当你使用merge()时,当我只在1之后,它会为DF1中的每一行返回10个结果。来自How to join (merge) data frames (inner, outer, left, right)?的解决方案似乎无法解决这个问题(除非我错过了它)。

DF1 = data.frame(matrix("", ncol = 5, nrow = 100))
DF1$X1 <- rep(c("K001","K002","K003","K004"), each=25)
DF1$X2 <- rep(c("M001","M002"), each=50)
DF1$X3 <- rep(c(1,3,5,8,10,1,3,5,8,10), each=10)
DF1$X4 <- 0
DF1$X5 <- 1:100
colnames(DF1) <- c("AREA", "CODE", "TYPE", "ID","AREA_ID")

DF2 = data.frame(matrix("", ncol = 3, nrow = 100))
DF2$X1 <- 1:100
DF2$X1 <- sprintf('G%i',DF2$X1)
DF2$X2 <- rep(c(1,3,5,8,10,1,3,5,8,10), each=10)
DF2$X3 <- rep(c("M001","M002"), each=50)
colnames(DF2) <- c("ID", "TYPE", "CODE")
DF2 <- DF2[sample(nrow(DF2)),]

for (a in c(1,3,5,8,10)){
for (b in 1:length(unique(DF1$CODE))){
LDF1 <- with(DF1, DF1[CODE == unique(DF1$CODE)[b] & TYPE == a,])
LDF2 <- with(DF2, DF2[CODE == unique(DF2$CODE)[b] & TYPE == a,])
LDF1$ID <- as.character(LDF2$ID)
DF1$ID[match(DF1$AREA_ID, LDF1$AREA_ID, nomatch = 0) != 0] <- LDF1$ID[match(DF1$AREA_ID, LDF1$AREA_ID, nomatch = 0)]
}
}

0 个答案:

没有答案