Предполагая, что у меня есть такой набор данных
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
Спасибо за любые предложения, советуйте.
Вероятно, чтобы сохранить время для всех наблюдений в выходных данных и не иметь дубликатов.
@JonSpring, Эдвард прав, последовательность, включая 1,1, 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, ваше решение сработало идеально. Спасибо.
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
Преднамеренно ли каждая последовательность включает 1,1, но не включает другие совпадения, например 2,2?