Mencocokkan beberapa indeks
Saya memiliki sekumpulan besar data di mana saya perlu membandingkan beberapa sampel dalam pengujian yang berbeda dan dalam kondisi yang berbeda-beda. Saya mencari cara untuk memasangkan dan menganalisis ini dengan mudah. Sebagai contoh, katakanlah saya memiliki Sampel (S) a, b, dan c, yang menjalani tes (T) 1 dan 2, dalam kondisi (C) x, y dan z, yang mengeluarkan hasil (R) R1 dan R2.
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
Tes memiliki keluaran yang berbeda, dan saya perlu menerapkan fungsi tertentu tergantung pada tesnya. Seperti:
Test1[a,b] = R1a/R1b
Test2[a,b] = R1a/R2a - R1b/R2b
Pengujian sebaiknya hanya diterapkan pada sampel dengan kondisi yang cocok, tetapi setiap sampel harus dipasangkan. Hasilnya adalah:
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
...
Saya sudah mencoba untuk mendapatkan hak ini untuk sementara waktu dan akhirnya membingungkan diri saya sendiri. Ada yang punya solusi atau saran? Jika Anda menginginkan format contoh yang mudah disalin:
{{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}}
Jawaban
Saya tidak yakin apakah saya mengerti dengan benar hasil mana yang harus digabungkan tetapi kode ini melakukan hal berikut: Pertama data dikumpulkan berdasarkan kondisi, kemudian dengan tes, kemudian subset panjang 2 dibuat dan pada langkah terakhir perhitungan numerik pada hasil diterapkan:
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
yang mengakibatkan
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
Ini bukan hasil OP yang diharapkan karena berisi semua subset yang mungkin untuk tes dan kondisi tertentu (misalnya entri ketiga b, c tes 1 dalam kondisi x). Jika ada kriteria yang lebih terlibat untuk kombinasi hasil, langkah yang menghasilkan subset dalam kode di atas perlu diganti / diperbaiki. Menggunakan Subsequencesalih-alih Subsetsmenganggap hanya tupel yang dipesan yang mungkin merupakan solusi yang dicari OP:
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
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 @@ #] &;
GroupBydata oleh {test, condition}(kolom 2 dan 3) dan proses 2-subset menggunakan proc:
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}]
Alternatifnya, kita bisa menggunakan GatherBy:
data2 == Join @@ Map[Map[proc] @ Subsets[#, {2}]&] @ GatherBy[Rest@data, #[[{2, 3}]]&]
True