[英]Merging dataframes by names using R
我想創建一個函數來合並其名稱包含定義的字符串的數據框。 在以下示例中, myfun(A)
將合並名稱包含“ A”(即A1
和A2
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)
}
我們可以使用mget
從list
的ls
獲取對象的值,然后可以通過使用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.