我的数据集有3个变量:
Patient ID Outcome Duration
1 1 3
1 0 4
1 0 5
2 0 2
3 1 1
3 1 2
我想要的是对每个患者身份证的“持续时间”进行第一次观察。
也就是说,对于#1患者,我希望持续时间读取患者#3的3,3,3我希望持续时间为1,1。
答案 0 :(得分:5)
这是data.table的一种方法。您取Duration
中的第一个数字,并要求R为每个PatientID
重复一次。
mydf <- read.table(text = "PatientID Outcome Duration
1 1 3
1 0 4
1 0 5
2 0 2
3 1 1
3 1 2", header = T)
library(data.table)
setDT(mydf)[, Duration := Duration[1L], by = PatientID]
print(mydf)
# PatientID Outcome Duration
#1: 1 1 3
#2: 1 0 3
#3: 1 0 3
#4: 2 0 2
#5: 3 1 1
#6: 3 1 1
答案 1 :(得分:2)
dplyr
这是一个很好的工作(数据框架是邪恶的 - plyr
更好的继承者,语法远比data.table
好得多):
library(dplyr)
dat %>%
group_by(`Patient ID`) %>%
mutate(Duration=first(Duration))
## Source: local data frame [6 x 3]
## Groups: Patient ID
##
## Patient ID Outcome Duration
## 1 1 1 3
## 2 1 0 3
## 3 1 0 3
## 4 2 0 2
## 5 3 1 1
## 6 3 1 1
答案 2 :(得分:0)
另一种使用plyr
的替代方案(如果您将对您的数据框进行大量操作,特别是如果它很大,我建议使用data.table
。它的学习曲线更陡峭但是非常值得。)
library(plyr)
ddply(mydf, .(PatientID), transform, Duration=Duration[1]) PatientID
# Outcome Duration
# 1 1 1 3
# 2 1 0 3
# 3 1 0 3
# 4 2 0 2
# 5 3 1 1
# 6 3 1 1