首页 > 解决方案 > 根据第二列计算/汇总 2 行的新变量给出 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 就会返回我想要的数据帧,但只填充 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 就会给我所需的计算值。知道如何解决这个问题吗?

标签: rdplyrnacalculated-columnssummarize

解决方案


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

我还建议使用match而不是==进行比较,因为如果数据中没有或,match则会返回一个。NA"t3""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')

推荐阅读