"by" 变量与循环的多次合并

Multiple merges with loop for "by" variables

我想进行多个合并:我有 38 个文件需要与一个文件合并,结果是 38 个合并文件。 by.yby.x 变量都会根据我要进行的每次合并而变化。为了尝试在一个循环中进行所有这些合并,我创建了三个变量列表:(i) 一个告诉我我们将用来执行循环的文件的名称; (ii) 一个带有 by.x 变量的名称,(iii) 一个带有 by.y 部分的变量名称。

请查看我的问题的简化示例,其中包含 3 个数据帧而不是 38 个:

(i) list_fam: c('f1990', 'f1991', 'f1992') #files to merge;
(ii) identifier_fam: c('f1','f2','f3') #by.x variables
(iii) identifier_ind: c('V1990','V1991','V1993') #by.y variables
(iv) ind: file to merge the list_fam

循环 1 暂定:

for (i in list_fam){
  for (j in identifier_fam){
    for (k in identifier_ind){
      x<-paste("z",i,sep="")
      x<-merge( i, ind, by.x = j , by.y = k) 
}
}
}

循环 2 暂定:

for (i in list_fam){
  for (j in identifier_fam){
    for (k in identifier_ind){
      x<-paste("z",i,sep="")
      assign(x, merge( i, ind, by.x = j , by.y = k)) 
}
}
}

在这两种情况下,我都收到错误:

Error in fix.by(by.x, x) : 'by' must specify a uniquely valid column.

任何线索我可能编码错误?

如评论中所述?Map是您要查找的内容:

Map(merge, mget(list_fam), list(ind),by.x=identifier_fam,by.y=identifier_ind)

可重现的例子

set.seed(1116)
f1990 <- data.frame(f1 = sample(letters,10), col90=1:10)
f1991 <- data.frame(f2 = sample(state.abb,10), col91=1:10)
f1992 <- data.frame(f3 = sample(month.abb,10), col92=1:10)
ind <- data.frame(V1990=sample(letters,10), 
                  V1991=sample(state.abb,10), 
                  V1992=sample(month.abb, 10))
identifier_fam <- c('f1','f2','f3') #by.x variables
identifier_ind <- c('V1990','V1991','V1992') #by.y variables

Map(merge, mget(ls(pattern="f\d{4}")), list(ind), by.x=identifier_fam, by.y=identifier_ind)
# $f1990
#   f1 col90 V1991 V1992
# 1  e     4    ND   Jul
# 2  g     2    OH   Nov
# 3  p     7    IA   May
# 4  s     6    SC   Sep
# 
# $f1991
#   f2 col91 V1990 V1992
# 1 MS     6     a   Feb
# 2 VT     8     o   Oct
# 
# $f1992
#    f3 col92 V1990 V1991
# 1 Apr     8     v    OK
# 2 Aug     3     z    FL
# 3 Feb    10     a    MS
# 4 Jul     4     e    ND
# 5 Jun     2     i    MN
# 6 May     5     p    IA
# 7 Nov     7     g    OH
# 8 Oct     1     o    VT
# 9 Sep     6     s    SC