#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 😉