在R中,我可以连接,然后调用variable column = concatenated string吗?

时间:2012-07-12 19:39:28

标签: r concatenation

我正在尝试在我的dataframe = data中确定一些患者的主要救护车到达时间。

主要救护车是现场的第1,第2,第3或第4辆车(每个病人/行data$prim.amb.num=1234

data$time_v1data$time_v2data$time_v3data$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="")

但当然,这不起作用。我甚至不确定谷歌如何做到这一点;我试过这个标题的各种组合但无济于事。有什么建议?

2 个答案:

答案 0 :(得分: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

每位患者获得第一辆救护车的到达时间,然后成为一个简单的oneliner:

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

答案 1 :(得分: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