2017-08-05 2 views
0

最後に私はかなり​​を作成したいが、AからB、BからC、BからAなどに行く人の数を表示する必要がある。中継中の数字を表示するためのデータ準備

マイセット:

#Generate some sample data: 

proc<-sample(c("EMR","RFA","Biopsies"), 100, replace = TRUE) 
#Sample dates 
dat<-sample(seq(as.Date('2013/01/01'), as.Date('2017/05/01'), by="day"), 100) 
#Generate 20 hospital numbers in no particular order: 
Id<-sample(c("P43","P63","K52","G24","S55","D07","U87","P22","Y76","I92","P22","P02","U22415","U23","S14","O34","T62","J32","F63","T43"), 100, replace = TRUE) 
df<-data.frame(proc,dat,Id) 

私はどうなるSnakeyプロット用のデータを用意しております場合:

Sankey<-dcast(setDT(df)[, if(any(proc=="EMR"|proc=="RFA")) .SD, Id], Id~rowid(Id), value.var ="proc") 

私に各tにおける各患者に何が起こるかを示す素敵なテーブルを与えることになります順番に指示する。

しかし、別のprocタイプ(すなわち、「EMR」、「RFA」および「生検」)のそれぞれの間を通過する患者の数を見つけるために、次のステップに進んでいきたいと思いますcirclize、すなわち(周波数がここで作られている)、望んでいるフォーマットへ

origin destination frequency 
EMR  RFA   14 
EMR  Biopsies  4 
EMR  EMR   10 
RFA  RFA   24 
RFA  Biopsies  42 
RFA  EMR   1 
Biopsies RFA   3 
Biopsies Biopsies  6 
Biopsies EMR   16 

または私はそれを表示する別の方法は

   destination 
       EMR   RFA  Biopsies 
origin 
EMR   10    14   4 
RFA   1    24   42 
Biopsies  16    3   6 

答えて

1

だろうと仮定し、私はそのタスクのためにdplyrを使用することになり、解析の中心は、関数です。各患者の最後の位置を追跡し、summariseは症例を数えます。

全体の分析は次のように行われることになります。私は一緒にすべての列を貼り付け、その後にstringrパッケージを使用して基本的にこれを行うための狡猾な方法を使用するために管理


# for reproducibility 
set.seed(20170805) 

# your data 
proc<-sample(c("EMR","RFA","Biopsies"), 100, replace = TRUE) 
#Sample dates 
dat<-sample(seq(as.Date('2013/01/01'), as.Date('2017/05/01'), by="day"), 100) 
#Generate 20 hospital numbers in no particular order: 
Id<-sample(c("P43","P63","K52","G24","S55","D07","U87","P22","Y76","I92","P22","P02","U22415","U23","S14","O34","T62","J32","F63","T43"), 100, replace = TRUE) 

# my approach using dplyr 
library(dplyr) 
#> 
#> Attaching package: 'dplyr' 
#> The following objects are masked from 'package:stats': 
#> 
#>  filter, lag 
#> The following objects are masked from 'package:base': 
#> 
#>  intersect, setdiff, setequal, union 
df <- data_frame(proc, dat, Id) 

df %>% 
# make sure that we progress in the direct order of time... 
arrange(dat) %>% 
# for each patient: 
group_by(Id) %>% 
# find the last position 
mutate(origin = lag(proc, 1), destination = proc) %>% 
# for each origin, destination-pair... 
group_by(origin, destination) %>% 
# summarise the number of pairs 
summarise(n = n()) %>% 
# not really necessary, but gives a littlebit nicer output here... 
ungroup() 
#> # A tibble: 12 x 3 
#>  origin destination  n 
#>  <chr>  <chr> <int> 
#> 1 Biopsies Biopsies  5 
#> 2 Biopsies   EMR  8 
#> 3 Biopsies   RFA 11 
#> 4  EMR Biopsies 11 
#> 5  EMR   EMR 11 
#> 6  EMR   RFA 10 
#> 7  RFA Biopsies  6 
#> 8  RFA   EMR 12 
#> 9  RFA   RFA  8 
#> 10  <NA> Biopsies  8 
#> 11  <NA>   EMR  4 
#> 12  <NA>   RFA  6 
+0

OKポイントを取得する@David。 –

+0

もちろん、あなたはdata.tableや他の形式も使うことができます:) – David

0

分離してから表にする。

library(stringr) 
Sankey<-dcast(setDT(df)[, if(any(proc=="EMR"|proc=="RFA")) .SD, Id], Id~rowid(Id), value.var ="proc") 

    Sankey$x <- apply(Sankey[ , 2:ncol(Sankey)] , 1 , paste , collapse = "-") 
    library(stringr) 
    myList<-unlist(str_extract_all(Sankey$x,"[A-Z|a-z]+-[A-Z|a-z]+")) 

table(myList) 
+0

これは間違った結果を与えるので、それほど狡猾ではありません!創造的な問題解決のために多くのこと。 –

関連する問題