2016-08-15 10 views
0

私は、各診療所が医者で構成され、患者の処置を行う診療所で構成されるデータセットを持っています。私は実行するために書かれている複数の引数を指定してオーバーロードする

クリニックリストまたは医師のリストのデータセットのフィルタリングに分析する(簡単なものは以下の通りです):私はどちらかのリストと、これらの関数を呼び出すしようとしています

num.of <- function(x.doctor, x.clinic){ 


if (!missing(x.clinic)){ 
    df_filter <- filter(df_clean, clinic == x.clinic) 
    } 
    if (!missing(x.doctor)) { 
    df_filter <- filter(df_clean, doctor == x.doctor) 
    } 
    num_doctor <- length(unique(df_filter$doctor)) 
    num_surveys <- nrow(df_filter) 
    num_procedure <- length(unique(df_filter$PPID)) 
    result <- setNames(c(num_doctor, num_surveys, num_procedure), c("num_doctor", "num_surveys", "num_procedure")) 
    return(result) 
} 

医師や診療所のリスト:

sapply(doctor_list, num.of, x.clinic = NULL) 

しかし、機能は上記のみの機能が動作しない、すなわち、「最初の」引数は、通過されたときに動作しますが、これは行います

sapply(clinic_list, num.of, x.doctor = NULL) 

初期関数の記述時に引数を逆にすると、上記の例とは逆の結果が真になります。

関数には、一度に1組の引数しか与えられません。x.doctorのリストまたはx.clinicのリストのいずれかです。

どうすれば関数を書き直すことができますか?apply x.clinicとx.doctorの別の関数呼び出しでどうすればいいですか?

ありがとうございました!

答えて

0

これを試してみてください:仕事も関数内からアクセスするdf_cleanことができますが、私は、スコープの違反を手伝っの自由を取った

sapply(doctor_list, num.of, data = df_clean, type = "doctor") 
sapply(clinic_list, num.of, data = df_clean, type = "clinic") 

num.of <- function(x, data, type = c("doctor", "clinic")) { 
    type <- match.arg(type) 
    df_filter <- 
    if (type == "doctor") { 
     filter(data, doctor == x) 
    } else { 
     filter(data, clinic == x) 
    } 
    num_doctor <- length(unique(df_filter$doctor)) 
    num_surveys <- nrow(df_filter) 
    num_procedure <- length(unique(df_filter$PPID)) 
    result <- setNames(c(num_doctor, num_surveys, num_procedure), c("num_doctor", "num_surveys", "num_procedure")) 
    return(result) 
} 

これは、明示的で明確な呼び出しを可能にします将来の問題を提示する。これは、複数のデータセットが存在する場合に、関数を非常に文脈依存で柔軟性のないものにします。あなたが100%確実であっても、あなたの呼び出し(またはグローバル)環境に常に常にdf_cleanがあります。これは(ベストプラクティスTMの間で)良い習慣です。

これが機能しない場合は、実際に機能をテストできるように、さらにreproducible exampleを作成する必要があります。実際のデータを含めることは望ましくない可能性があるので、簡単な名前と簡単なサンプルデータを使用して、これまでと同じように一般的なものにすると他の人にとっては非常に簡単になります。

+0

ありがとうございました! – joelross

+0

答えを受け入れることはできますか? – r2evans

関連する問題