R разница в каждом наблюдении в пределах Id

Предполагая, что у меня есть такой набор данных

id   time       cd4  sequence
1   -0.741958   548  1 
1   -0.246407   893  2
1    0.243669   657  3
        
2   -2.7296369  464  1
2   -2.2505131  845  2
2   -0.221766   752  3
2    0.221766   459  4
2    0.77481198 181  5
2    1.256673   434  6

Мне нравится вычислять разницу в значениях cd4, самом раннем значении, с любым другим значением в пределах этого идентификатора.

ID 1, имеет 3 наблюдения, самое раннее - в момент времени -0,741. Код должен оценить разницу значений cd4,

sequence 1 vs sequence 2 : 893 - 548
sequence 1 vs sequence 3 : 657 - 548
sequence 2 vs sequence 4 : 657 - 893

Id 2 имеет 6 наблюдений, это 6Choose2, то есть 15 различных комбинаций.

Итак, ожидая такого набора данных

id  time        cd4 seq comb    cd4_lag
1   -0.74195    548 1   1,1     0
1   -0.24640    893 2   1,2     345
1   0.243669    657 3   1,3     109
1                       2,3    -236
2   -2.72963    464 1   1,1 
2   -2.25051    845 2   1,2     381
2   -0.22176    752 3   1,3     288
2   0.221766    459 4   1,4     -5
2   0.774811    181 5   1,5     -283
2   1.256673    434 6   1,6     -30
                        2,3     -93
                        2,4     -386
                        2,5     -664
                        2,6     -411
                        3,4     -293
                        3,5     -571
                        3,6     -318
                        4,5     -278
                        4,6     -25
                        5,6      253

Спасибо за любые предложения, советуйте.

Преднамеренно ли каждая последовательность включает 1,1, но не включает другие совпадения, например 2,2?

Jon Spring 29.06.2024 23:07

Вероятно, чтобы сохранить время для всех наблюдений в выходных данных и не иметь дубликатов.

Edward 30.06.2024 00:31

@JonSpring, Эдвард прав, последовательность, включая 1,1, 2,2, не имеет значения.

Ahir Bhairav Orai 30.06.2024 05:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Может быть, что-то вроде этого? Я исключил совпадения 1,1, поскольку мне было неясно, почему их следует включать, а не другие совпадения.

library(dplyr)
df |>
  inner_join(df |> select(-time),
            join_by(id, sequence < sequence)) |>
  mutate(cd4_lag = cd4.y - cd4.x)

Результат

   id      time cd4.x sequence.x cd4.y sequence.y cd4_lag
1   1 -0.741958   548          1   893          2     345
2   1 -0.741958   548          1   657          3     109
3   1 -0.246407   893          2   657          3    -236
4   2 -2.729637   464          1   845          2     381
5   2 -2.729637   464          1   752          3     288
6   2 -2.729637   464          1   459          4      -5
7   2 -2.729637   464          1   181          5    -283
8   2 -2.729637   464          1   434          6     -30
9   2 -2.250513   845          2   752          3     -93
10  2 -2.250513   845          2   459          4    -386
11  2 -2.250513   845          2   181          5    -664
12  2 -2.250513   845          2   434          6    -411
13  2 -0.221766   752          3   459          4    -293
14  2 -0.221766   752          3   181          5    -571
15  2 -0.221766   752          3   434          6    -318
16  2  0.221766   459          4   181          5    -278
17  2  0.221766   459          4   434          6     -25
18  2  0.774812   181          5   434          6     253

вы не пишете код, вы пишете стихи на R, ваше решение сработало идеально. Спасибо.

Ahir Bhairav Orai 30.06.2024 05:56
library(dplyr)

inner_join(df, df, by = "id", relationship = "many-to-many") |> 
    filter(sequence.x<sequence.y & sequence.x!=1 | sequence.x==1) |>
    transmute(id=id, time=time.y, cd4=cd4.y, seq=sequence.y, 
              comb=paste(sequence.x, sequence.y, sep = ","), 
              cd4_lag=cd4.y-cd4.x)

      id   time   cd4   seq comb  cd4_lag
 1     1 -0.742   548     1 1,1         0
 2     1 -0.246   893     2 1,2       345
 3     1  0.244   657     3 1,3       109
 4     1  0.244   657     3 2,3      -236
 5     2 -2.73    464     1 1,1         0
 6     2 -2.25    845     2 1,2       381
 7     2 -0.222   752     3 1,3       288
 8     2  0.222   459     4 1,4        -5
 9     2  0.775   181     5 1,5      -283
10     2  1.26    434     6 1,6       -30
11     2 -0.222   752     3 2,3       -93
12     2  0.222   459     4 2,4      -386
13     2  0.775   181     5 2,5      -664
14     2  1.26    434     6 2,6      -411
15     2  0.222   459     4 3,4      -293
16     2  0.775   181     5 3,5      -571
17     2  1.26    434     6 3,6      -318
18     2  0.775   181     5 4,5      -278
19     2  1.26    434     6 4,6       -25
20     2  1.26    434     6 5,6       253

Другие вопросы по теме