簡體   English   中英

使用R按名稱合並數據框

[英]Merging dataframes by names using R

我想創建一個函數來合並其名稱包含定義的字符串的數據框。 在以下示例中, myfun(A)將合並名稱包含“ A”(即A1A2 myfun(A)的數據幀,而將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)
}

我們可以使用mgetlistls獲取對象的值,然后可以通過使用Reduce進行merge

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

我經常使用此功能,它需要一個目錄,然后為它提供一個標准,它應該選擇.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)) 

或者我使用它的方式是瀏覽一個Parrent文件夾,並檢查子文件夾是否包含.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)
                            }
                    }
            }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM