2017-01-04 5 views
0

私は、既存のデータフレームに新しいバイナリ変数を生成するカスタム関数を作成しようとしています。この考えは、診断記述(文字列)、ICD9診断コード(番号)、および患者データベースを関数に与えることができるようにすることです。この関数は、関心のあるすべての診断に対して新しい変数を生成し、患者(行または観測)が診断を有する場合には0または1を割り当てる。カスタム関数を使用して既存のデータフレーム内に新しいバイナリ変数を作成する方法は?

patient diag_1 diag_2 diag_3 Anemia 
1  a 8661 8651 2430  0 
2  b 2851 8674 3456  1 
3  c 8651 2866 9089  0 

diagnosis_func<-function(x,y,z,i){ 

pattern = paste("^(", paste0(x, collapse = "|"), ")", sep = "") 

i$z<-ifelse(rowSums(sapply(i[y], grepl, pattern = pattern)) != 0,"1","0") 

} 

これは私が機能を実行した後に取得したいと思い何である:以下

x<-c("2851") #ICD9 for Anemia 
y<-c("diag_1") #Primary diagnosis 
z<-"Anemia" #Name of new binary variable for patient dataframe 
i<-patient_db #patient dataframe 

patient<-c("a","b","c") 
diag_1<-c("8661", "2851","8651") 
diag_2<-c("8651","8674","2866") 
diag_3<-c("2430","3456","9089") 

patient_db<-data_frame(patient,diag_1,diag_2,diag_3) 

    patient diag_1 diag_2 diag_3 
1  a 8661 8651 2430 
2  b 2851 8674 3456 
3  c 8651 2866 9089 

が関数である:

は、以下の機能変数です関数内の行は関数外でテストされており、workingです。私が立ち往生しているところでは、機能を働かせようとしています。どんな助けでも大歓迎です。

ハッピーニューイヤー

Albit

+1

私はあなたの関数の戻り値がないと思います。あなたの関数に 'return(i)'という行を追加するだけで問題は解決します。 – raymkchow

+0

あなたの迅速な返信Raymkchowに感謝します。私はちょうどリターン(i)を試みました、それはコンソールのデータフレームに値を設定しますが、新しい変数を追加しません。 –

+0

Rのオブジェクトは不変なので、参照で 'i'を渡すことはできません。 'patient_db < - diagnosis_func(x、y、z、i)'のような変数を割り当てる必要があります。また、コードの4行目( 'i <-patient_db #patient dataframe')は' patient_db'の宣言の後に置かれ、正しい 'i'が得られます。 – raymkchow

答えて

1

あなたが一度に一つの診断を受けた唯一の作品に意図されている場合、これは動作します。私は、コード内で作業するのが少し簡単になるように、名前を変更するという自由を取った。あなたは不注意によるミスを防ぐために、少しそれを美化したい場合は、あなたがcheckmateパッケージをインストールし、このバージョンを使用することができます

diagnosis_func <- function(data, target_col, icd, new_col){ 
    pattern <- sprintf("^(%s)", 
        paste0(icd, collapse = "|")) 

    data[[new_col]] <- grepl(pattern = pattern, 
          x = data[[target_col]]) + 0L 
    data 
} 

diagnosis_func(patient_db, "diag_1", "2851", "Anemia") 

# Multiple codes for a single diagnosis 
diagnosis_func(patient_db, "diag_1", c("8661", "8651"), "Dx") 

。これは

diagnosis_func <- function(data, target_col, icd, new_col){ 

    coll <- checkmate::makeAssertCollection() 

    checkmate::assert_class(x = data, 
          classes = "data.frame", 
          add = coll) 

    checkmate::assert_character(x = target_col, 
           len = 1, 
           add = coll) 

    checkmate::assert_character(x = icd, 
           add = coll) 

    checkmate::assert_character(x = new_col, 
           len = 1, 
           add = coll) 

    checkmate::reportAssertions(coll) 

    pattern <- sprintf("^(%s)", 
        paste0(icd, collapse = "|")) 

    data[[new_col]] <- grepl(pattern = pattern, 
          x = data[[target_col]]) + 0L 
    data 
} 

diagnosis_func(patient_db, "diag_1", "2851", "Anemia") 
+0

素晴らしい!あなたの助けに多くの多くの感謝のベンジャミン。 –

+0

ベンジャミン - 申し訳ありませんが、旅行していました。私が最後にコードを試してみると、うまくいきません試してみましたが、 "patient_db"データベースが列数を1つ増やしましたか? –

+0

これをもう一度見て、あなたの質問に記載されている正確な出力を得ています。 「どちらもうまくいきません」と思われるものを詳しく説明できますか?エラーメッセージが表示されますか?結果をオブジェクト( 'patient_db' < - diagnosis_func(patient_db、...)')に保存していますか? – Benjamin

関連する問題