2015-08-17 74 views
0

我想創建一個函數來合併名稱中包含已定義字符串的數據幀。在以下示例中,myfun(A)將合併名稱包含「A」的數據幀,即A1A2,並將B1留出。按名稱合併數據幀使用R

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) 
} 
+1

嘗試'減少(函數(...)合併(...,by ='id'),mget(ls(pattern ='A \\ d +')))' – akrun

+1

@akrun,Spot on !非常感謝 – goclem

+0

看起來像某種類型的[this]類型(http://stackoverflow.com/questions/8091303/simultaneously-merge-multiple-data-frames-in-a-list) –

回答

2

我們可以使用mget來從ls對象在list的價值和使用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 
0

我經常使用這個函數,它需要一個目錄,然後你給它一個標準它應該選擇.c sv文件。

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) 
          } 
        } 
      } 
    }