代码之家  ›  专栏  ›  技术社区  ›  Basti

使用reduce函数合并时,从数据帧列表中检索数据帧名称

  •  0
  • Basti  · 技术社区  · 6 年前

    我正试图用 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)
    

    使用 names() 关于reduce函数中的参数,我将使用 姓名() 在列表对象上 l2[[1]] 而不是在更高级别的对象上 l2[1] .关于如何访问实际数据帧名称(即dat01_特征化等)的想法

    +++更新+++

    它与最初的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))
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Nicolas2    6 年前

    dat01_表征、dat02_同意、dat03_psqi不是数据。框架名称,但包含数据的变量的名称。框架内容。一旦将列表计算为l2,计算每个变量,原始名称就会丢失。见str(l2)