2017-06-06 78 views
1

我有一個數據幀患者數據和隨時間變化的不同變量R在應用group_by時提取mutate中的相應其他值

數據幀看起來有點像這一點,但更實驗室值的變量:

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功能,因爲第一個()和最後一個()沒有與NA值工作。 此後,我對grouped_by'id'使用了mutate_all(因爲原始df中有更多的實驗值)計算了該患者的last1()和first1()實驗值之間的差異。

但無法找到如何提取相應時間值(delta-time值)的值,我需要計算下降的斜率。

最後,我想是這樣的(最後一行):

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

我們可以嘗試

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 
+0

感謝@akrun,如果數據幀有你的解決方案會工作只有1個變量,但我有49個變量o f我想要計算斜率,所以我嘗試了以下內容: 'df2 = df%>% group_by(subject_id)%>% filter _(!is.na(。))%>% summarise_each (funs(diff =(last1(。) - first1(。))/(last1(time)-first1(time))))' 但是,它仍然需要min()和max()時間值而不是與價值相對應的時間值,我會得到不同的斜率。 我在上面的數據框中添加了一個額外的變量,以闡明。 – Saar