0

我试图在我的 dataframe= 中确定许多患者的主要救护车到达时间data

主要救护车是现场的第 1、2、3 或 4 辆车(data$prim.amb.num=1234每个患者/行)。

data$time_v1, data$time_v2,data$time_v3并且data$time_v4有一个时间或缺失值,对应于相关的第 1、2、3 和 4 辆车。

我想做的是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

设置示例数据:

# 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 回答
3

虽然我喜欢@mhermans 的回答,但如果你想要一个单线,一种解决方案是使用?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 回答