我想创建一个合并名称包含已定义字符串的数据框的函数。在以下示例中,myfun(A)
会合并名称中包含“A”的数据框,即A1
和A2
,并将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)
}
答案 0 :(得分:3)
我们可以使用mget
从ls
中的list
获取对象的值,然后我们可以merge
使用Reduce
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
答案 1 :(得分:0)
我经常使用这个函数,它接受一个目录,然后给它一个标准,它应该选择.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)
}
}
}
}