2017-11-05 6 views
0

2つの引数リストを持つ関数を呼び出して、すべての既存のrbind(優先bind_rows)したいと思います。私の一般的なコードのthats:r 2つの引数リストと既存のbind_rowsを持つ関数呼び出し

combine <- function(arg1, agr2){ 
    df_gen<-read_csv2(paste0(arg1,"/FolderPref", arg2,"/PID_var.csv")) %>% 
    select(PID, Site) %>% 
    mutate(Group=arg2) 

    dir<-list.files(path = paste0(arg1,"/FolderPref", arg2), pattern = "\\General_information.csv$") 
    df<-read_csv2(paste0(arg1,"/FolderPref", arg2,"/", dir)) %>% 
    filter(Status == 2) %>% 
    inner_join(df_gen, by="PID") %>% 
    mutate(enrollment=dmy_hm(Date)) %>% 
    select(PID, Group, Site, enrollment) 
    return(df) 
} 

arg1<-list("center1", "center2", "center3", "center4", "center5") 
arg2<-list("Group1", "Group2", "Group3", "Group4", "Group5") 

私の究極の目的は、引数1のすべての可能な組み合わせで1人のDF持つことです(center1-GROUP1、center1・グループ2、... center2-GROUP1、center2-グループ2を、...)

問題は、「General_Information.csv」ファイルがすべて存在するとは限りません。したがって、5×5の組み合わせから、最終データフレームは25個未満の単一dfを有することになる。

もちろん、私は "結合"と "bind_rows"呼び出しに存在しないdfのコメントを25行書くことができます。しかし、私はこの問題に対するより良い解決策があることを知っています。

あなたのサポートを楽しみにしています。

答えて

0

これは私が通常何をすべきかです:

# Make all possible combinations of your arguments 
argExpand <- expand.grid(arg1, arg2) 
head(argExpand) 

#  Var1 Var2 
# 1 center1 Group1 
# 2 center2 Group1 
# 3 center3 Group1 
# 4 center4 Group1 
# 5 center5 Group1 
# 6 center1 Group2 

# Iterate using foreach 
library(foreach) 
foreach(i = 1:nrow(argExpand), .combine = rbind) %do% { 
    combine(argExpand[i, 1], argExpand[i, 2]) 
} 

PS:使用file.exists()存在しない可能性がありますファイルを操作するには:

file <- paste0(arg1,"/FolderPref", arg2,"/PID_var.csv") 
if (file.exists(file)) { 
    df_gen <- read_csv2(file) %>% 
     select(PID, Site) %>% 
     mutate(Group = arg2) 
} 
+0

はありがとうございました。 file.existsには前にWD changeコマンドが必要で、isTURE(file.exits(file))が必要です。手伝ってくれてどうもありがとう。 – Stephan

+0

@Stephanあなたの問題を解決する助けがあれば私の解決策を受け入れることができます – PoGibas

関連する問題