"by" 变量与循环的多次合并
Multiple merges with loop for "by" variables
我想进行多个合并:我有 38 个文件需要与一个文件合并,结果是 38 个合并文件。 by.y
和 by.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
我想进行多个合并:我有 38 个文件需要与一个文件合并,结果是 38 个合并文件。 by.y
和 by.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