我正在尝试在我的dataframe = data
中确定一些患者的主要救护车到达时间。
主要救护车是现场的第1,第2,第3或第4辆车(每个病人/行data$prim.amb.num=1
,2
,3
或4
。
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="")
但当然,这不起作用。我甚至不确定谷歌如何做到这一点;我试过这个标题的各种组合但无济于事。有什么建议?
答案 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