Вычисление/Суммирование новой переменной из 2 строк в зависимости от второго столбца дает NA

#r #dplyr #na #calculated-columns #summarize

Вопрос:

Я надеюсь на помощь разведки роя! При подготовке моего фрейма данных лабораторных значений в разные моменты времени я сталкиваюсь со следующей проблемой. Мой фрейм данных имеет длинный формат, состоящий из 5 переменных: идентификатор субъекта (sid), точка времени (zeitpunkt), группа вмешательства в клиническом исследовании (группа), лабораторный параметр (параметр), фактическое значение параметра (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 разных строк, отличающихся второй переменной «timepoint») в коде, 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 дает мне желаемое расчетное значение. Есть идеи, как я могу это исправить?

Комментарии:

1. Что должно произойти, если этого не t3 произойдет ? Использовать t2 или t[max_value] ?

2. (messwert[zeitpunkt == "t3"]-messwert[zeitpunkt = "t0"]/messwert[zeitpunkt == "t0"]) должно быть (messwert[zeitpunkt == "t3"]-messwert[zeitpunkt == "t0"])/messwert[zeitpunkt == "t0"] : одного = не хватает, и вы должны поставить ) его в другое положение. Ваш код (более или менее) эквивалентен messwert[zeitpunkt == "t3"] - 1 .

3. Если нет t3, он должен просто вернуть NA. Большое вам спасибо за вашу помощь, я думаю, что моя проблема была в опечатке!

4. Viel Erfolg noch!

Ответ №1:

Как упоминал @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')
 

Комментарии:

1. Большое тебе спасибо, Ронак!! Я думаю, что я просто следил за опечаткой и, следовательно, адаптировал код для «соответствия». Большое спасибо!!

2. Приятно знать, спасибо за быстрое введение в stackoverflow 😉