여러 인덱스 일치

Nov 03 2020

다양한 테스트와 다양한 조건에서 여러 샘플을 비교해야하는 많은 데이터 세트가 있습니다. 쉽게 페어링하고 분석 할 수있는 방법을 찾고 있습니다. 예를 들어, 결과 (R) R1 및 R2를 출력하는 조건 (C) x, y 및 z에서 테스트 (T) 1 및 2를 겪는 샘플 (S) a, b 및 c가 있다고 가정 해 보겠습니다.

S   T   C   R1  R2
a   1   x   2.9
a   1   y   2.6
a   1   z   8.7
a   2   x   9.4 0.372
a   2   y   8.1 0.208
a   2   z   7.6 0.154
b   1   x   7.5
b   1   y   7.3
b   1   z   1.7
b   2   x   3.9 0.213
b   2   y   7.9 0.435
b   2   z   2.5 0.294
c   1   x   6.2
c   1   y   1.8
c   1   z   6.3
c   2   x   1.5 0.246
c   2   y   6.0 0.496
c   2   z   1.7 0.167

테스트 결과가 다르기 때문에 테스트에 따라 특정 기능을 적용해야합니다. 예 :

Test1[a,b] = R1a/R1b
Test2[a,b] = R1a/R2a - R1b/R2b

테스트는 조건이 일치하는 샘플에만 적용되어야하지만 각 샘플은 쌍을 이루어야합니다. 따라서 결과는 다음과 같습니다.

S1  S2  T   C   R
a   b   1   x   2.9/7.5
a   c   1   x   2.9/6.2
a   b   2   x   9.4/0.372-3.9/0.213
a   c   2   x   9.4/0.372-1.5/0.246
a   b   1   y   2.6/7.3
...

나는 한동안 이것을 올바르게하려고 노력해 왔으며 결국 혼란스러워졌습니다. 누구든지 해결책이나 제안이 있습니까? 쉽게 복사 할 수있는 예제 형식을 원하는 경우 :

{{S, T, C, R1, R2}, {a, 1, x, 2.9}, {a, 1, y, 2.6}, {a, 1, z, 8.7},
 {a, 2, x, 9.4, 0.372}, {a, 2, y, 8.1, 0.208}, {a, 2, z, 7.6, 0.154},
 {b, 1, x, 7.5}, {b, 1, y, 7.3}, {b, 1, z, 1.7}, {b, 2, x, 3.9, 0.213},
 {b, 2, y, 7.9, 0.435}, {b, 2, z, 2.5, 0.294}, {c, 1, x, 6.2}, {c, 1, y, 1.8},
 {c, 1, z, 6.3}, {c, 2, x, 1.5, 0.246}, {c, 2, y, 6., 0.496}, {c, 2, z, 1.7, 0.167}}

답변

4 N0va Nov 03 2020 at 20:36

어떤 결과를 다시 결합해야하는지 정확히 이해했는지 확실하지 않지만이 코드는 다음을 수행합니다. 먼저 데이터가 조건별로 수집 된 다음 테스트에 의해 수집 된 다음 길이 2의 하위 집합이 생성되고 최종 단계에서 결과에 대한 수치 계산 은 적용되다:

test1[{{a_,1,c_,R1a_},{b_,1,c_,R1b_}}]:={a,b,1,c,R1a/R1b}
test2[{{a_,2,c_,R1a_,R2a_},{b_,2,c_,R1b_,R2b_}}]:={a,b,2,c,R1a/R2a-R1b/R2b}

{{S,T,C,R1,R2},{a,1,x,2.9},{a,1,y,2.6},{a,1,z,8.7},{a,2,x,9.4,0.372},{a,2,y,8.1,0.208},{a,2,z,7.6,0.154},{b,1,x,7.5},{b,1,y,7.3},{b,1,z,1.7},{b,2,x,3.9,0.213},{b,2,y,7.9,0.435},{b,2,z,2.5,0.294},{c,1,x,6.2},{c,1,y,1.8},{c,1,z,6.3},{c,2,x,1.5,0.246},{c,2,y,6.,0.496},{c,2,z,1.7,0.167}};

GatherBy[%,#[[3]]&][[2;;]];
Flatten[GatherBy[#,{x}\[Function]x[[2]]]&/@%,1];
Flatten[Subsets[#,{2}]&/@%,1];
If[#[[1,2]]===1,test1[#],test2[#]]&/@%;
%//TableForm

결과적으로

a   b   1   x   0.386667
a   c   1   x   0.467742
b   c   1   x   1.20968
a   b   2   x   6.95896
a   c   2   x   19.1713
b   c   2   x   12.2123
a   b   1   y   0.356164
a   c   1   y   1.44444
b   c   1   y   4.05556
a   b   2   y   20.7814
a   c   2   y   26.8455
b   c   2   y   6.06415
a   b   1   z   5.11765
a   c   1   z   1.38095
b   c   1   z   0.269841
a   b   2   z   40.8472
a   c   2   z   39.171
b   c   2   z   -1.67624

주어진 테스트 및 조건에 대해 가능한 모든 하위 집합이 포함되어 있으므로 예상되는 결과 OP가 아닙니다 (예 : 조건 x에서 세 번째 항목 b, c 테스트 1). 결과 조합에 더 관련된 기준이있는 경우 위 코드에서 하위 집합을 생성하는 단계를 대체 / 정련해야합니다. Subsequences대신 사용하면 SubsetsOP가 찾고있는 솔루션 일 수있는 정렬 된 튜플 만 고려합니다.

a   b   1   x   0.386667
b   c   1   x   1.20968
a   b   2   x   6.95896
b   c   2   x   12.2123
a   b   1   y   0.356164
b   c   1   y   4.05556
a   b   2   y   20.7814
b   c   2   y   6.06415
a   b   1   z   5.11765
b   c   1   z   0.269841
a   b   2   z   40.8472
b   c   2   z   -1.67624
4 kglr Nov 03 2020 at 22:09
data = {{"S", "T", "C", "R1", "R2"}, {a, 1, x, 2.9}, {a, 1, y, 
    2.6}, {a, 1, z, 8.7}, {a, 2, x, 9.4, 0.372}, {a, 2, y, 8.1, 
    0.208}, {a, 2, z, 7.6, 0.154}, {b, 1, x, 7.5}, {b, 1, y, 7.3}, {b,
     1, z, 1.7}, {b, 2, x, 3.9, 0.213}, {b, 2, y, 7.9, 0.435}, {b, 2, 
    z, 2.5, 0.294}, {c, 1, x, 6.2}, {c, 1, y, 1.8}, {c, 1, z, 
    6.3}, {c, 2, x, 1.5, 0.246}, {c, 2, y, 6., 0.496}, {c, 2, z, 1.7, 
    0.167}};

Grid[data, Dividers -> All, Background -> {None, 1 -> LightBlue}, 
  Alignment -> {{Center, Center, Center, ".", "."}, Center}] 

t1 = {#[[1]], #2[[1]], #[[2]], #[[3]], #[[4]]/#2[[4]]} &;
t2 = {#[[1]], #2[[1]], #[[2]], #[[3]], #[[4]]/#[[5]] - #2[[4]]/#2[[5]]} &;
proc = If[#[[1, 2]] === 1, t1 @@ #, t2 @@ #] &;

GroupBy{test, condition}(열 2 및 3)에 의한 데이터 및 proc다음을 사용하여 2- 부분 집합 처리 :

data2 = Join @@  Values @ GroupBy[Rest @ data, #[[{2, 3}]] &, 
   Map[proc] @ Subsets[#, {2}] &];

Grid[Prepend[{"S1", "S2", "T", "C", "R"}]@data2, 
  Dividers -> All, Background -> {None, 1 -> LightBlue}, 
  Alignment -> {{Center, Center, Center, Center, "."}, Center}] 

또는 다음을 사용할 수 있습니다 GatherBy.

data2 == Join @@ Map[Map[proc] @ Subsets[#, {2}]&] @ GatherBy[Rest@data, #[[{2, 3}]]&]
 True