繁体   English   中英

当应用group_by时,R在mutate中提取相应的其他值

[英]R extracting corresponding other values in mutate when group_by is applied

我有一个包含患者数据随时间变化的不同变量的测量值的数据框。

数据框看起来像这样,但更多的实验室值变量:

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,创建了first1last1函数,因为first()和last()不适用于NA值。 之后,我将grouped_by'id'用于了mutate_all(因为原始df中存在更多的实验室值)计算了该患者的last1()和first1()实验值之间的差异。

但是找不到如何提取对应的时间值(增量时间值)的值,而我需要这些值来计算下降的斜率。

最终我想要这样的东西(最后一行):

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甚至是否对此有解决方案,因此将不胜感激。 :)

我们可以试试

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM