Ես աշխատում եմ տվյալների վերլուծության փոքր գործիքի վրա և այդ ընթացքում պրակտիկ/սովորում եմ Scala-ն: Այնուամենայնիվ, ես խրվեցի մի փոքր խնդրի մեջ.
Ենթադրենք տիպի տվյալներ.
X Gr1 x_11 ... x_1n
X Gr2 x_21 ... x_2n
..
X GrK x_k1 ... x_kn
Y Gr1 y_11 ... y_1n
Y Gr3 y_31 ... y_3n
..
Y Gr(K-1) ...
Այստեղ ես ունեմ գրառումներ (X,Y...), որոնք կարող են լինել կամ չլինել մինչև K խմբերում՝ յուրաքանչյուր խմբի համար արժեքների շարքով: Այն, ինչ ես ուզում եմ անել, բավականին պարզ է (տեսականորեն), ես կցանկանայի համախմբել տողերը, որոնք պատկանում են նույն «էությանը» տարբեր խմբերում: այնպես որ մի քանի տողերի փոխարեն, որոնք սկսվում են X
-ով, ես ուզում եմ ունենալ մեկ տող՝ x_11
-ից x_kn
բոլոր արժեքներով սյունակներում:
Այնուամենայնիվ, ամեն ինչ բարդացնում է այն, որ ոչ բոլոր սուբյեկտներն են գոյություն ունեն բոլոր խմբերում: Այսպիսով, որտեղ կա «բացակայող տվյալներ», ես կցանկանայի լրացնել, օրինակ, զրոները կամ ինչ-որ տող, որը նշանակում է բացակայող արժեք: Այսպիսով, եթե ես ունեմ (X,Y,Z) մինչև 3 խմբերում, ապա I տիպի աղյուսակը, որը ես ուզում եմ ունենալ, հետևյալն է.
X x_11 x_12 x_21 x_22 x_31 x_32
Y y_11 y_12 N/A N/A y_31 y_32
Z N/A N/A z_21 z_22 N/A N/A
Ես խրված եմ՝ փորձելով պարզել սա, կա՞ արդյոք ցանկի գործառույթներն օգտագործելու խելացի միջոց՝ դա լուծելու համար:
Ես գրել եմ այս պարզ օղակը.
for {
(id, hitlist) <- hits.groupBy(_.acc)
h <- hitlist
} println(id + "\t" + h.sampleId + "\t" + h.ratios.mkString("\t"))
որպեսզի կարողանաք ստեղծել աղյուսակներ, որոնք նման են վերը նշված օրինակին: Նկատի ունեցեք, որ իմ սկզբնական տվյալները տարբեր ձևաչափի և դասավորության են, բայց դա քիչ առնչություն ունի առկա խնդրի հետ, ուստի ես բաց եմ թողել վերլուծության հետ կապված բոլոր քայլերը: Ես պետք է կարողանամ օգտագործել groupBy
-ն ավելի լավ ձևով, որն իրականում կլուծի դա ինձ համար, բայց կարծես թե չեմ կարող հասնել դրան:
Այնուհետև ես փոփոխեցի իմ օղակը՝ hits
-ը ratios
-ի քարտեզագրելով և դրանք միմյանց կցելով.
for ((id, hitlist) <- hits.groupBy(_.acc)){
val l = hitlist.map(_.ratios).foldRight(List[Double]()){
(l1: List[Double], l2: List[Double]) => l1 ::: l2
}
println(id + "\t" + l.mkString("\t"))
//println(id + "\t" + h.sampleId + "\t" + h.ratios.mkString("\t"))
}
Դա ինձ մեկ քայլ ավելի է մոտեցնում, բայց դեռ սիգար չկա: Լրիվ ծածկված «մատրիցի» փոխարեն ես ստանում եմ ատամնավոր սեղան: Վերը նշված օրինակը վերցնելով.
X x_11 x_12 x_21 x_22 x_31 x_32
Y y_11 y_12 y_31 y_32
Z z_21 z_22
Կա՞ պատկերացում, թե ինչպես կարող եմ աղյուսակը լրացնել այնպես, որ համապատասխան խմբերի արժեքները համապատասխանեցվեն միմյանց հետ: Ես պետք է կարողանամ օգտագործել _.sampleId
-ը, որը պահում է «խմբի անդամը» յուրաքանչյուր «հարվածի» համար, բայց ես վստահ չեմ, թե կոնկրետ ինչպես: «Հիթերը» Hit
տիպի Ցանկ է, որը գործնականում յուրաքանչյուր տողի համար փաթաթում է, որը տալիս է անհատական արժեքներ ստանալու հարմար մեթոդներ, հետևաբար, ըստ էության, բազմակի, որոնք ունեն «անվանված ինդեքսներ» (օրինակ՝ .acc
, .sampleId
...):
(Ես կցանկանայի լուծել այս խնդիրը առանց խմբերի թվի կոշտ կոդավորման, քանի որ այն կարող է փոխվել դեպքից դեպք)
Շնորհակալություն
x_ij
-ը իրական արժեքներն են, այլ ոչ թե ենթամուտը: Btw Ես ավելացրի ավելի շատ տեղեկություններ, ինչպես դուք խնդրեցիք 22.07.2013