Calculate/Summarize 2 行的新变量取决于第二列给出 NA

Calculate/Summarize new variable of 2 rows depending on second column gives NA

希望得到群智能的帮助! 在准备跨不同时间点的实验室值数据框时,我遇到了以下问题。 我的数据框是长格式的,由 5 个变量组成:受试者 ID (sid)、时间点 (zeitpunkt)、临床试验的干预组 (gruppe)、实验室参数 (parameter)、参数的实际值 (messwert) 和值的单位(einheit)。

    A tibble: 6 x 6
    sid zeitpunkt gruppe parameter                      messwert einheit
  <dbl> <chr>     <chr>  <chr>                             <dbl> <chr>  
1     1 t0        DGE    ACPA(citrull. Prot.-Ak) EIA/Se  1000    U/ml   
2     1 t3        DGE    ACPA(citrull. Prot.-Ak) EIA/Se  1000    U/ml   
3     1 t2        DGE    Apolipoprot. A1 HP                 1.31 g/l    
4     1 t2        DGE    Apolipoprotein B                   0.61 g/l    
5     1 t0        DGE    aPTT Pathromtin SL                34.3  sek.   
6     1 t1        DGE    aPTT Pathromtin SL                37.3  sek.   
> 

我现在想比较每个人从基线 (t0) 到最后一个时间点 (t3) 的每个参数值的变化百分比,这样我就可以比较两种干预措施的平均值。有问题:某些值缺失,有些值可能存在两次但在实验室测量两次或样品缺失的情况下略有不同。此外,某些参数仅在基线时进行评估。

我试图通过将这个新变量汇总到一个新变量来计算百分比变化

    dataframe: labor_change <-
      labor_long %>%
      group_by(sid, gruppe, parameter, zeitpunkt) %>%
      arrange(sid, parameter, zeitpunkt)%>%
      summarize(messwert=mean(messwert))%>%
      ungroup()%>%
      group_by(sid, gruppe, parameter) %>%
      summarize(changet3t0 =
                  (messwert[zeitpunkt == "t3"]-messwert[zeitpunkt = "t0"]/messwert[zeitpunkt == "t0"])*100)

我现在的问题:一旦我在代码中使用来自两个不同时间点(又名 2 个不同的行,第二个变量“时间点”不同)的值,R returns 我就会得到所需的数据帧,但是仅填充 NA:

# Groups:   sid, gruppe, parameter [6]
    sid gruppe parameter             changet3t0
  <dbl> <chr>  <chr>                      <dbl>
1     1 DGE    aPTT Pathromtin SL            NA
2     1 DGE    Basophile %                   NA
3     1 DGE    Basophile absolut             NA
4     1 DGE    Calcium                       NA
5     1 DGE    Creatinkinase (CK) HP         NA
6     1 DGE    CRP HP                        NA
> 

只要我从计算中删除一个时间点,R 就会给我所需的计算值。知道我该如何解决这个问题吗?

正如@Martin Gal 在一个地方提到的,您使用的是 = 而不是 ==,目前您使用的是 (x-y/x),但您想要的是 (x-y)/x这是不同的。

我还建议使用 match 而不是 == 进行比较,因为如果没有 [=19],match 会 return 和 NA =] 或数据中的 "t0"

library(dplyr)

labor_change  <- labor_long %>%
  group_by(sid, gruppe, parameter, zeitpunkt) %>%
  arrange(sid, parameter, zeitpunkt)%>%
  summarize(messwert=mean(messwert))%>%
  group_by(sid, gruppe, parameter) %>%
  summarize(changet3t0 = (messwert[match('t3', zeitpunkt)]-messwert[match("t0", zeitpunkt)])/
              messwert[match("t0",zeitpunkt)]*100, .groups = 'drop')