0

私は、データフレーム内の多数の患者の救急車の一次到着時刻を特定しようとしています= data

主要な救急車は、現場の1台目、2台目、3台目、または4台目の車両のいずれかです(、、、、data$prim.amb.num=1または各患者/列)。234

data$time_v1、、data$time_v2および時間または欠落値があります。これは、関連する場合、1台目、2台目、3台目、および4台目の車両に対応しますdata$time_v3data$time_v4

私がやりたいのは、prim.amb.time一次救急車の到着時間に対応する時間で新しい変数=を作成することです。患者=1の場合、救急車が最初でした。それなら欲しいdata[1,"prim.amb.time"]=data[1,"time_v1"]

私は次のように正しいことを理解することができtime_v*ます:

paste("time_v", data$prim.amb.num, sep="")

しかし、正しい列を呼び出すために結果の情報を渡す方法については行き詰まっています。

私の望みは、単に次のようなものを持つことでした。

data$prim.amb.time<-data$paste("time_v", data$prim.amb.num, sep="")

もちろん、これは機能しません。これをグーグルで検索する方法すらわかりません。このタイトルのさまざまな組み合わせを試しましたが、役に立ちませんでした。助言がありますか?

4

2 に答える 2

3

@mhermans の回答が気に入りましたが、ワンライナーが必要な場合、1 つの解決策は?apply次のように使用することです。

#From @mhermans
zz <- textConnection("patient.id prime.amb.num time_v1 time_v2 time_v3 time_v4
1000 1 30 40 60 100 
1001 3 40 50 60 80
1002 2 10 30 40 45
1003 1 24 40 45 60
")
d <- read.table(zz, header = TRUE)
close(zz)

#Take each row of d and pull out time_vn where n = d$prime.amb.num
d$prime.amb.time <- apply(d, 1, function(x) {x[x['prime.amb.num'] + 2]})

> d
  patient.id prime.amb.num time_v1 time_v2 time_v3 time_v4 prime.amb.time
1       1000             1      30      40      60     100             30
2       1001             3      40      50      60      80             60
3       1002             2      10      30      40      45             30
4       1003             1      24      40      45      60             24

編集 - または次の場合paste:

d$prime.amb.time <- 
  apply(
    d, 
    1, 
    function(x) {
      x[paste('time_v', x['prime.amb.num'], sep = '')]
    }
  )
#Gives the same result
于 2012-07-12T20:26:40.290 に答える
3

サンプル データを設定します。

# read in basic example data for four patients, wide format
zz <- textConnection("patient.id prime.amb.num time_v1 time_v2 time_v3 time_v4
1000 1 30 40 60 100 
1001 3 40 50 60 80
1002 2 10 30 40 45
1003 1 24 40 45 60
")
d <- read.table(zz, header = TRUE)
close(zz)

サンプル データセットでは、データが次のようになっていると想定しています。

  patient.id prime.amb.num time_v1 time_v2 time_v3 time_v4
1       1000             1      30      40      60     100
2       1001             3      40      50      60      80
3       1002             2      10      30      40      45
4       1003             1      24      40      45      60

そのデータ構造を考えると、行ごとの患者ではなく、行ごとに車両を持つデータセットを操作する方がおそらく簡単です。これは、 を使用reshape()してワイド フォーマットからロング フォーマットに変換することで実現できます。

dl <- reshape(d, direction='long', idvar="patient.id", varying=list(3:6))
# ordering & rename var for aesth. reasons:
dl <- dl[order(dl$patient.id, dl$time),]
dl$vehicle.id <- dl$time 
dl$time <- NULL
dl

これにより、車両ごとに行を持つ長いデータセットが得られます。

       patient.id prime.amb.num time_v1 vehicle.id
1000.1       1000             1      30          1
1000.2       1000             1      40          2
1000.3       1000             1      60          3
1000.4       1000             1     100          4
1001.1       1001             3      40          1
1001.2       1001             3      50          2
1001.3       1001             3      60          3
1001.4       1001             3      80          4
1002.1       1002             2      10          1
1002.2       1002             2      30          2
1002.3       1002             2      40          3
1002.4       1002             2      45          4
1003.1       1003             1      24          1
1003.2       1003             1      40          2
1003.3       1003             1      45          3
1003.4       1003             1      60          4

患者ごとの最初の救急車の到着時刻を取得すると、単純なワンライナーになります。

dl[dl$prime.amb.num == dl$vehicle.id,]

を与える

       patient.id prime.amb.num time_v1 vehicle.id
1000.1       1000             1      30          1
1001.3       1001             3      60          3
1002.2       1002             2      30          2
1003.1       1003             1      24          1
于 2012-07-12T20:13:51.590 に答える