【发布时间】:2018-10-28 21:53:34
【问题描述】:
我正在尝试将数据框列表与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_characteristic 等)的任何想法
+++更新+++
它不适用于原始的 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))
}
【问题讨论】: