【问题标题】:Merging dataframes by names using R使用 R 按名称合并数据框
【发布时间】:2015-11-09 22:42:12
【问题描述】:

我想创建一个函数来合并名称包含已定义字符串的数据帧。在以下示例中,myfun(A) 将合并名称包含“A”的数据帧,即A1A2,而将B1 排除在外。

A1=data.frame(id=paste0("id",1:10),var1=letters[sample(1:26,10)])
A2=data.frame(id=paste0("id",1:10),var2=LETTERS[sample(1:26,10)])
B1=data.frame(id=paste0("id",1:10),var3=letters[sample(1:26,10)])

我最好的尝试(不起作用):

myfun=function(my.pattern){
  dfs=ls(,pattern=paste(my.pattern)) # Getting the list of dataframes whose name contains the pattern
  merged_df=merge(dfs[1],dfs[2],by=id) # Merging those dataframes
  return(merged_df)
}

【问题讨论】:

  • 试试Reduce(function(...) merge(..., by='id'), mget(ls(pattern='A\\d+')))
  • @akrun,当机立断!非常感谢
  • 似乎是this的某种类型的欺骗

标签: r merge dataframe


【解决方案1】:

我经常使用这个函数,它接受一个目录,然后你给它一个标准,它应该选择 .csv 文件。

combine_csv <- function(dir, criterion1 = "subject"){ 
    dir<-list.files(dir, full.names =TRUE)
    data <- data.frame()
    cat_string <- c() # inititalize character vector

    for (i in dir) {
            if (grepl(criterion1, i)) {

                    cat_string <- c(cat_string, i)
            }
    }
    tables <- lapply(cat_string, read.csv, header = TRUE)
    data <- do.call(rbind , tables)
    return(data)      
}

甚至可以自定义以包含多个条件

if (grepl(criterion1, i) & grepl(criterion2, i)) 

或者我使用它的方式是查看一个父文件夹,并检查子文件夹是否包含我正在寻找的 .csv 文件

    for (i in 1:length(parent_dir_content)) {
            cur_dir <- parent_dir_content[i]
            if (grepl(criterion1, cur_dir)) {
                    cur_files<-list.files(cur_dir, full.names =TRUE)
                    for (j in 1:length(cur_files)) {
                            cur_file <- cur_files[j]
                            if (grepl(criterion2, cur_file)){
                                    cat_string <- c(cat_string, cur_file)
                            }
                    }
            }
    }

【讨论】:

    【解决方案2】:

    我们可以使用mgetlist中的ls中获取对象的值,然后我们可以使用mergeReducemerge

    myfun <- function(my.pattern){
     v1 <- ls(pattern=my.pattern, envir=parent.frame())
     Reduce(function(...) merge(..., by = 'id'), mget(v1, envir=parent.frame()))
    }
    
    myfun('A\\d+')
    # id var1.x var1.y
    #1   id1      d      R
    #2  id10      c      V
    #3   id2      z      E
    #4   id3      w      W
    #5   id4      l      U
    #6   id5      y      X
    #7   id6      h      P
    #8   id7      n      H
    #9   id8      f      O
    #10  id9      g      A
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 2013-05-16
      • 2013-02-14
      • 2013-02-16
      • 2013-04-20
      • 1970-01-01
      相关资源
      最近更新 更多