2017-10-04 4 views
0

大きなデータフレーム(4631行×2995列)があります。行は米国のすべての病院の郵便番号を表し、列は患者の郵便番号を表します。患者の家庭と病院との距離を計算して、各セルの値が各患者の自宅と各病院の間の距離を表す数値になるようにしました。大きなdfのすべての変数の最小値とIDを返すR

例のDFは次のとおりです。

 10960  11040 56277 55379  

37160 674.14 238.04 25.89  5.31 

37091 162.62 71.25 428.56 672.11 

89148 931.31 0.03  389.25 1000.05 

91776 15.05  508.74 315.61 101.01 

私は今、何をしたいか、各患者のための5つの最も近い病院を表すことになる、患者ごとに最低5つの値を抽出しています。しかし、私はセルの値を抽出する必要があるだけでなく、私はそれらの病院がある郵便番号を知ることができるように行の名前も必要です。

したがって、たとえば、私はそれぞれの最低の2つの値私は、患者10960の場合、最も近い病院が15.05マイル離れており、91776郵便番号にあり、2番目に近い病院は162.62マイル離れており、37091郵便番号にあることを知りたいと思います。

私はこのデータを転記していますので、私がうまく行と列を入れ替えることでこれを行うほうが簡単です。私はそれを行うためのコードは必要ありません。

私は、関数を使って最も低い値を得る方法を見つけました。そして、適用してはいけませんが、それは私に対応する郵便番号を与えません。

私は助けていただきありがとうございます!

ありがとうございます!

+0

データセットのサンプルの例を挙げてください。多分 'dput(1:10、1:5)'のようなものでしょうか?郵便番号と患者コードは、それぞれrownamesとcolnamesだけですか? – beigel

+0

申し訳ありませんが、あなたが求めている例が何であるか分かりません。はい、病院の郵便番号はrownamesであり、患者コードはcolnamesであり、セルの値は病院と患者の自宅の郵便番号の間のマイルです。患者ジッパーは別のデータセットにあり、このデータフレームは私の距離分析の出力に過ぎません。ここで病院ジップと患者ジップ間の距離を計算しました。 –

答えて

0

何かがトリックを行う必要があり、病院のための列を追加しました:

library(dplyr) 
library(tidyr) 

df %>% 
    mutate(hospital = rownames(.)) %>% 
    gather("patient", "distance", -hospital) %>% 
    group_by(patient) %>% 
    arrange(distance) %>% 
    slice(1:5) %>% 
    ungroup 

まずrownamesからhospital列を追加し、 gatherステップで距離用の列が行に変換されます。各列名は新しいpatient列の下の項目になり、各列の距離はdistance列の一部になります。 group_byおよびarrangeは、各患者内の距離をソートし、sliceはそれぞれの最初の5行を取ります。 ungroupは必須ではありませんが、グループ化が不要になった場合はgroup_byを元に戻すといいです。

0

多分これは動作します:

library(dplyr) 

test <- lapply(1:length(df), function(i) { 
    x <- arrange(df, names(df)[i]) 
    tibble(HospitalZipCode = rownames(x)[1:5], 
     Distance = x[1:5,i, drop=TRUE], 
     Order = 1:5, 
     PatientID=names(df)[i]) 
    }) %>% bind_rows() 

をこれはあなたの患者あたり5行を持つ表を与える必要があります。私はこのような(最も近い1、第2などのため2)

関連する問題