我有一个患者数据的数据框,以及随着时间的推移不同变量的测量。
数据框看起来有点像这样但更多的实验室值变量:
df <- data.frame(id=c(1,1,1,1,2,2,2,2,2),
time=c(0,3,7,35,0,7,14,28,42),
labvalue1=c(4.04,NA,2.93,NA,NA,3.78,3.66,NA,2.54),
labvalue2=c(NA,63.8,62.8,61.2,78.1,NA,77.6,75.3,NA))
> df2
id time labvalue1 labvalue2
1 1 0 4.04 NA
2 1 3 NA 63.8
3 1 7 2.93 62.8
4 1 35 NA 61.2
5 2 0 NA 78.1
6 2 7 3.78 NA
7 2 14 3.66 77.6
8 2 28 NA 75.3
9 2 42 2.54 NA
我想为每位患者(具有唯一ID)计算第一次和最后一次测量的每天减少或斜率 。比较患者之间的斜率。时间是几天。所以,最终我想要一个新变量,例如diff_labvalues - 对于每个值,给出了labvalue1:
对于患者1:(2.93-4.04)/ (7-0)
和对于患者2:(2.54-3.78)/(42-7)
(现在忽略其间的测量,只是最后一次); labvalue2等等。
到目前为止,我已经使用了dplyr,创建了 first1 和 last1 函数,因为first()和last()不能使用NA值。 此后,我有了group_by&#39; id&#39;,使用mutate_all(因为原始df中有更多的lab-values)计算了该患者的last1()和first1()实验室值之间的差异。
但是无法找到如何提取相应时间值(delta时间值)的值,我需要计算下降的斜率。
最终我想要这样的东西(最后一行):
first1 <- function(x) {
first(na.omit(x))
}
last1 <- function(x) {
last(na.omit(x))
}
df2 = df %>%
group_by(id) %>%
mutate_all(funs(diff=(last1(.)-first1(.)) / #it works until here
(time[position of last1(.)]-time[position of first1(.)]))) #something like this
不确定tidyverse是否有解决方案,所以任何帮助将不胜感激。 :)
答案 0 :(得分:0)
我们可以尝试
df %>%
group_by(id) %>%
filter(!is.na(labs)) %>%
summarise(diff_labs = (last(labs) - first(labs))/(last(time) - first(time)))
# A tibble: 2 x 2
# id diff_labs
# <dbl> <dbl>
#1 1 -0.15857143
#2 2 -0.03542857
和
> (2.93-4.04)/ (7-0)
#[1] -0.1585714
> (2.54-3.78)/(42-7)
#[1] -0.03542857
或另一个选项是data.table
library(data.table)
setDT(df)[!is.na(labs), .(diff_labs = (labs[.N] - labs[1])/(time[.N] - time[1])) , id]
# id diff_labs
#1: 1 -0.15857143
#2: 2 -0.03542857