我想加入两个数据帧 . 但是,与普通连接不同,我想匹配第一个和第二个列的一系列列 . 基本上我有一个网站列表,其中提到了最近的周边网站 . 我需要在一个单独的数据框中查找最近的站点全Gauge和LTA ID . 我提供了一些示例数据帧,包括一个示例输出,但实际上并不是这么整洁(并且有更多的列和行)这就是为什么我需要查找 TestRefList
中的 Surrogate
量表,而不是创建以下方法 .
library(plyr)
library(tidyverse)
TestRefList <- data.frame(Site = paste0("sl",1:10,".1"), Gauge = paste0(1:10,".1","/110.00/1"), LTA = paste0(1:10,".1","/110.99/1"), stringsAsFactors = F)
Surrogates <- data.frame(Primary = paste0("sl",c(2,4,6),".1"), nearest1=paste0("sl",1:3,".1"), nearest2=paste0("sl",7:9,".1"), stringsAsFactors = F)
HopefulOutput <- data.frame(Primary = paste0("sl",c(2,4,6),".1"), nearest1=paste0("sl",1:3,".1"), nearest2=paste0("sl",7:9,".1"),
nearest1Gauge = paste0(1:3,".1","/110.00/1"), nearest1LTA = paste0(1:3,".1","/110.99/1"),
nearest2Gauge = paste0(7:9,".1","/110.00/1"), nearest2LTA = paste0(7:9,".1","/110.99/1"), stringsAsFactors = F)
我以为我可以使用plyr :: ldply和dplyr :: left_join的某些组合,例如:Out < - ldply(names(Surrogates)[2:3],function(x)left_join(Surrogates,TestRefList,by = c(paste0) (x,'=“网站”'))))
但是我无法使用列表中的名称加入工作 . 我已经在列表之外尝试了一些“和”的安排,例如:
left_join(Surrogates,TestRefList, by = c(paste0('"',names(Surrogates)[2],'"' , '="Site"')))
即使我可以让这部分工作,我也不确定它在ldply中是如何工作的 .
有任何想法吗?如果有必要,我很高兴能够采用完全不同的方式,尽管我对data.frames和tidyverse比data.table选项更舒服
3 回答
我提供基于
data.table
的解决方案 . 当然可以按照您的要求使用dplyr
完成您的任务 . 但是我不知道dplyr能够解决这个问题 . 另外,我认为下面的data.table解决方案非常优雅和快速,只要您愿意在工作流程中添加另一个包 . 此外,此代码已经适用于数据中的任意数量的"nearest n"列 .您可以根据需要重命名列 . 这可以通过
dplyr::left_join
完成,但几乎没有变化:或在管道内:
这是
Surrogates
中任意数量的"nearest"列的通用解决方案 . 它首先得到"nearest"列的向量,然后从那里开始 .输出: