多次合并循环,用于" by"变量

时间:2015-11-16 15:30:00

标签: r loops merge paste assign

我想进行多次合并:我需要将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.

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

1 个答案:

答案 0 :(得分:3)

如评论?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