我正在尝试做一些我认为非常简单的事情让我难过。
说我有以下数据框:
id< - c(“bob_geldof”,“billy_bragg”,“melvin_smith”)代码< - c(“blah”……
以下解决方案使用base-R并进行了简化。步骤1:使用左连接将主“df”和“alternates”df合并在一起。步骤2:检查ID2值未丢失的位置(NA),然后将这些值分配给“id”。这将使您的原始ID保持可用;并将其替换为ID2,其中匹配ID可用
解决方案:
combined <- merge(x=df,y=alternates,by.x="id",by.y="ID1",all.x=T) combined$id[!is.na(combined$ID2)] <- combined$ID2[!is.na(combined$ID2)]
使用完整的原始数据帧定义(使用stringsAsFactors = F):
id <- c("bob_geldof", "billy_bragg", "melvin_smith") code <- c("blah", "di", "blink") df <- as.data.frame(cbind(id,code),stringsAsFactors = F) ID1 <- c("bob_geldof", "melvin_smith") ID2 <- c("the_builder", "kelvin") alternates <- as.data.frame(cbind(ID1, ID2),stringsAsFactors = F) combined <- merge(x=df,y=alternates,by.x="id",by.y="ID1",all.x=T) combined$id[!is.na(combined$ID2)] <- combined$ID2[!is.na(combined$ID2)]
结果:(完全合并下面,你也可以 combined[,c("id","code")] 为简化的结果)。这里保留了不匹配的“billy_bragg”;其他人用匹配的ID替换
combined[,c("id","code")]
> combined id code ID2 1 billy_bragg di <NA> 2 the_builder blah the_builder 3 kelvin blink kelvin