在与 reduce 函数合并时从数据框列表中检索数据框名称

Retrieve dataframe name from list of data frames while merging with reduce function

我正在尝试使用 reduce 函数将数据框列表合并在一起,并且我正在努力重命名具有名称的重复列名称的“.x”和“.y”结尾数据帧的数量。

dat01_characterization<-data.frame(usubjid = as.factor(sample(10)), col2 = letters[1:10], col3 = letters[1:10])
dat02_consent<-data.frame(usubjid = as.factor(sample(10)), col3 = letters[1:10], col4 = letters[1:10])
dat03_psqi<-data.frame(usubjid = as.factor(sample(10)), col5 = letters[1:10], col3 = letters[1:10])

l2<-mget(ls(pattern="dat0"))
#l2<-list(dat01_characterization,dat02_consent,dat03_psqi)

mergefunction<-function(x,y){
  xname<-substr(names(x),regexpr("_",names(x))+1,nchar(names(x)))
  yname<-substr(names(y),regexpr("_",names(y))+1,nchar(names(y)))
  merged_data<-merge(x,y,by=c("usubjid"),all=TRUE)
  colnames(merged_data)<-gsub("\.x",paste0("\.",xname),names(merged_data))
  colnames(merged_data)<-gsub('\.y',paste0("\.",yname),names(merged_data))
  return(merged_data)
}
bbb<-Reduce(function(x,y) mergefunction(x,y),l2)

在 reduce 函数的参数上使用 names() 会给我数据帧的列名,就像在列表对象 l2[[1]] 上使用 names() 而不是在更高级别的对象上一样l2[1]。关于如何访问实际数据框名称(即 dat01_characterization 等)的任何想法

+++更新+++

它不适用于原始的 reduce 函数,我不得不用 for 循环编写自己的版本。工作原理如下:

dat01_characterization2<-data.frame(usubjid = as.factor(sample(10)), col2 = letters[1:10], col3 = letters[1:10])
dat02_consent2<-data.frame(usubjid = as.factor(sample(10)), col3 = letters[1:10], col4 = letters[1:10])
dat03_psqi2<-data.frame(usubjid = as.factor(sample(10)), col5 = letters[1:10], col3 = letters[1:10])

l3<-mget(ls(pattern="dat0"))

out<-l3[[1]]
for(i in 2:length(l3)){
  yname<-substr(names(l3[i]),regexpr("_",names(l3[i]))+1,nchar(names(l3[i])))
  out<-merge(out,l3[[i]],by=c("usubjid"),all=TRUE)
  colnames(out)<-gsub("\.x","",names(out))
  colnames(out)<-gsub('\.y',paste0("\.",yname),names(out))
}

dat01_characterization、dat02_consent、dat03_psqi 不是 data.frame 名称,而是包含 data.frame 内容的变量名称。一旦将列表评估为 l2,评估每个变量,原始名称就会丢失。参见 str(l2)