0

考え方は以下の通りです。すべての患者には固有の患者 ID があり、これをhidenic_idと呼びます。ただし、この患者は複数回入院する可能性があります。一方、すべてのエントリには一意のemtek_idがあります。

患者 110380 は 2001 年 4 月 14 日 11:08 に入院し、その後病院を転院し、2001 年 4 月 24 日 18:16 に退院しました。この患者は、現在別の emtek_id を持っているため、2001 年 5 月 11 日 23:24 に再び入院しました。彼は 2001 年 5 月 25 日 16:26 に退院しました。そのため、日付を確認して正しい emtek_ids を割り当てる必要があります。結合されたファイルの日付が入院と退院の期間内 (または 24 時間のように非常に近い) である場合、その emtek_id を割り当てることができます。

hidenic_id と入院時間を含むエントリに異なる emtek_ID を割り当てるにはどうすればよいですか?

4

2 に答える 2

1

共有する価値のあるアイデアがいくつかありました。

まず、hidenic_id と日付から emtek_id を作成します。次に、emtek_id を解析用に論理的にします (例: emtek_id@dataTime)。3 番目に、データベースをグローバル ベクトルにします。メモリの制限によっては、これよりも高速な方法があるはずですが、いくつかのアイデアが得られるかもしれません。

主な問題は、NA 値と不正な hidenic_id の処理、hidenic_id の検証、先頭に文字がない場合の ID のパディングです (これは簡単な修正になります)。最後に、正しくないが NA/null ではない入力をどのように処理しますか? たとえば、「ID12345」の代わりに「ID」を入力したとします。それを新しい値を割り当てるための呼び出しとして扱いますか、それとも正しい入力 XOR NA 値を求めるプロンプトを表示しますか? 正しい ID 入力または NA 値のみをフィードすると仮定しますが、これは私の単純化した仮定です。

アイデアを開始するための疑似コードを次に示します。データの保存方法を選択します (例: csv ファイルの場合は data.table::fread() を使用):

#this file's name is "make.hidenic_id.R"
library(data.table)
library(stringr)
set.seed(101)
#one might one a backup written, perhaps conditionally updating it every hour or so.
database.hidenic_id <<-data.table::fread("database.filename.hidenic_id.csv")
database.emtek_id   <<-data.table::fread("database.filename.emtek_id.csv") 

make.hidenic_Id = function(in.hidenic_id){
            if(is.na(in.hidenic_id) | !(in.hidenic_id %in% database.hidenic_id)){
                new.hidenic_id=NA
                #conditionally make new hidenic_id
                while( new.hidenic_id %in% database.hidenic_id){
                    new.hidenic_id = paste0("ID",str_pad(sample.int(99999, 1),5,pad=0))
                }
                #make new emtek_id
                new.emtek_id <- paste0(new.hidenic_id,  sep="@",  str_sub(Sys.time(),1,16))
                
                #update databases; e.g., c(database.emtek_id, new.emtek_id)
                database.hidenic_id <<- c(database.hidenic_id, new.hidenic_id)
                database.emtek_id   <<- c(database.emtek_id,   new.emtek_id)
            }else{
                new.emtek_id <- paste0(in.hidenic_id,  sep="@",  str_sub(Sys.time(),1,16))
              # update database.emtek_id 
              database.emtek_id   <<- c(database.emtek_id,   new.emtek_id)  
            }
            return(new.emtek_id)
}
temp = readline(prompt="Enter hidenic_id OR type \"NA\": ")
data.table::fwrite(database.emtek_id,  "database.filename.emtek_id.csv") 
data.table::fwrite(database.hidenic_id,"database.filename.hidenic_id.csv") 

でファイルを呼び出します

source("make.hidenic_id.R") 

貧弱な入力データを管理したり、検索を最適化したりするために私が行っていない「良い習慣」がたくさんありますが、これは強力なスタートです。より長い整数または別の先行文字列を使用することも良い方法ですが、入力値を使用して ID を作成できるとは決して言いませんでした。

すべてが地理的 ID 変数ごとに 1 つの巨大な文字列であるため、これは国勢調査に触発されたと言えます。

于 2020-08-13T18:30:06.113 に答える
0

私はあなたの問題に興味を持っていたので、いくつかのモックデータを作成して問題を解決しようとしましたが、自分で混乱してから質問を投稿しました. ここで応答を確認できます: How can I know if a time point exists between set of before and after times

私の投稿は、あなたが始めていると私が信じているものを生成し、チェックされた答えはあなたが探していると私が信じているものです。完全なコードは以下のとおりです。と をインストールする必要がありzooますIRanges。また、バージョン 2.15.3 でこれを行いました。 IRanges3.0.0 では正しくインストールされませんでした。

## package installation
source("http://bioconductor.org/biocLite.R")
  biocLite("IRanges")
install.packages("zoo")


## generate the emtek and hidenic file data
library(zoo)
date_string <- paste("2001", sample(12, 10, 3), sample(28,10), sep = "-")
time_string <- c("23:03:20", "22:29:56", "01:03:30", "18:21:03", "16:56:26",
                 "23:03:20", "22:29:56", "01:03:30", "18:21:03", "16:56:26")

entry_emtek <- strptime(paste(date_string, time_string), "%Y-%m-%d %H:%M:%S")
entry_emtek <- entry_emtek[order(entry_emtek)]
exit_emtek <- entry_emtek + 3600 * 24
emtek_file <- data.frame(emtek_id = 1:10, entry_emtek, exit_emtek)

hidenic_id <- 110380:110479
date_string <- paste("2001", sample(12, 100, replace = TRUE), sample(28,100, replace = T), sep = "-")
time_string <- rep(c("23:03:20", "22:29:56", "01:03:30", "18:21:03", "16:56:26",
                 "23:03:20", "22:29:56", "01:03:30", "18:21:03", "16:56:26"),10)
hidenic_time <- strptime(paste(date_string, time_string), "%Y-%m-%d %H:%M:%S")
hidenic_time <- hidenic_time[order(hidenic_time)]
hidenic_file <- data.frame(hidenic_id, hidenic_time)

## Find the intersection of emtek and hidenic times.  This part was done by user: agstudy
library(IRanges)
## create a time intervals 
subject <- IRanges(as.numeric(emtek_file$entry_emtek),
        as.numeric(emtek_file$exit_emtek))
## create a time intervals (start=end here)
query <- IRanges(as.numeric(hidenic_file$hidenic_time),
        as.numeric(hidenic_file$hidenic_time))
## find overlaps and extract rows (both time point and intervals)  
emt.ids <- subjectHits(findOverlaps(query,subject))
hid.ids <- queryHits(findOverlaps(query,subject))
cbind(hidenic_file[hid.ids,],emtek_file[emt.ids,])
于 2013-06-21T17:00:36.567 に答える