【问题标题】:Carry Forward First Observation for a Variable For Each Patient对每个患者的变量进行第一次观察
【发布时间】:2015-07-13 02:16:26
【问题描述】:

我的数据集有 3 个变量:

Patient ID    Outcome     Duration  
1               1          3
1               0          4
1               0          5
2               0          2
3               1          1
3               1          2

我想要的是每个患者 ID 的“持续时间”的第一个观察结果。

也就是说,对于患者 #1,我希望持续时间为 3、3、3 对于患者 #3,我希望持续时间为 1、1。

【问题讨论】:

  • dd$Duration <- with(dd, ave(Duration, ID, FUN = function(x) x[1])) 如果您想使用包,请回答以下问题

标签: r dataset data-manipulation


【解决方案1】:

这是使用 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, 1, 3),后跟(1, 0, 3)。这里有错字吗?或者这是你想要你的代码做的?
  • @TimBiegeleisen 我很困惑。你能澄清你的意思吗?我看到问题的原始数据中第一行有(1, 1, 3)
  • @TimBiegeleisen 如果我没记错的话,这是 OP 要求的。
  • 很公平......我会投票赞成......只是希望这些问题能更清楚,但如果是这样的话,他们可能不会一开始就问 SO ^ ^。我以为他只是想复制每个病人的第一行。
  • @TimBiegeleisen 不是错字,同一患者在不同时间有重复观察。有些患者的就诊次数比其他患者多。
【解决方案2】:

这对dplyr 来说是件好事(plyr 的一个 data.frame wicked-better 继任者,语法比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

【讨论】:

    【解决方案3】:

    使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2018-04-18
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 2022-01-07
      相关资源
      最近更新 更多