AMcoder - javascript, python, java, html, php, sql

Scala-ում տվյալների աղյուսակի համախմբում

Ես աշխատում եմ տվյալների վերլուծության փոքր գործիքի վրա և այդ ընթացքում պրակտիկ/սովորում եմ 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-ն ավելի լավ ձևով, որն իրականում կլուծի դա ինձ համար, բայց կարծես թե չեմ կարող հասնել դրան:

Այնուհետև ես փոփոխեցի իմ օղակը՝ hitsratios-ի քարտեզագրելով և դրանք միմյանց կցելով.

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...):

(Ես կցանկանայի լուծել այս խնդիրը առանց խմբերի թվի կոշտ կոդավորման, քանի որ այն կարող է փոխվել դեպքից դեպք)

Շնորհակալություն


  • Ես դժվարանում եմ հասկանալ, թե ինչ եք պահանջում: Կարո՞ղ եք տեղադրել ձեր տեղադրած աղյուսակի արդյունքների օրինակներ (ձեր ուզածը և ձեր ունեցածը): 19.07.2013
  • @gzm0-ն ավելացրեց ավելի շատ տեղեկություններ, մասնավորապես ձեր խնդրած արդյունքների օրինակները 22.07.2013

Պատասխանները:


1

Սա մի փոքր հորինված օրինակ է, բայց ես կարծում եմ, որ դուք կարող եք տեսնել, թե ուր է սա գնում.

  case class Hit(acc:String, subAcc:String, value:Int)

  val hits = List(Hit("X", "x_11", 1), Hit("X", "x_21", 2), Hit("X", "x_31", 3))
  val kMax = 4
  val nMax = 2

  for {
    (id, hitlist) <- hits.groupBy(_.acc)
    k <- 1 to kMax
    n <- 1 to nMax
  } yield {
    val subId = "x_%s%s".format(k, n)
    val row = hitlist.find(h => h.subAcc == subId).getOrElse(Hit(id, subId, 0))

    println(row)
  }

//Prints
Hit(X,x_11,1)
Hit(X,x_12,0)
Hit(X,x_21,2)
Hit(X,x_22,0)
Hit(X,x_31,3)
Hit(X,x_32,0)
Hit(X,x_41,0)
Hit(X,x_42,0)

Եթե ​​դուք ավելի շատ տեղեկություններ տրամադրեք ձեր hits ցուցակների վերաբերյալ, ապա մենք, հավանաբար, կարող ենք մի փոքր ավելի ճշգրիտ բան բերել:

19.07.2013
  • հմմ, շնորհակալություն պատասխանի համար, բայց գուցե ինչ-որ թյուրիմացություն է եղել, x_ij-ը իրական արժեքներն են, այլ ոչ թե ենթամուտը: Btw Ես ավելացրի ավելի շատ տեղեկություններ, ինչպես դուք խնդրեցիք 22.07.2013

  • 2

    Ինձ հաջողվել է լուծել այս խնդիրը հետևյալ կոդով, ես այն դնում եմ այստեղ՝ որպես պատասխան, եթե մեկ ուրիշը նման խնդրի հանդիպի և օգնություն պահանջի։ Նոյի պատասխանից find()-ի օգտագործումը միանշանակ շատ օգտակար էր, այնպես որ նրան +1 տվեք, եթե այս կոդի հատվածը ձեզ օգնի:

    val samples = hits.groupBy(_.sampleId).keys.toList.sorted
    for ((id, hitlist) <- hits.groupBy(_.acc)) {
      val ratios =
        for (sample <- samples)
          yield hitlist.find(h => h.sampleId == sample).map(_.ratios)
          .getOrElse(List(Double.NaN, Double.NaN, Double.NaN, Double.NaN, Double.NaN, Double.NaN))
      println(id + "\t" + ratios.flatten.mkString("\t"))
    }
    

    Կարծում եմ, որ դա այնքան էլ էլեգանտ կամ արդյունավետ լուծում չէ, քանի որ ես երկու զանգ ունեմ groupByին, և ես կցանկանայի տեսնել այս խնդրի ավելի լավ լուծումներ:

    22.07.2013
  • Դուք կարող եք չընդունել ձեր լուծումը, եթե ցանկանում եք ավելի լավը, այնպես որ մարդիկ տեսնում են, որ ձեր հարցը դեռ լուծված չէ: 22.07.2013
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..