2017-09-19 10 views
0

私はScalaでデータを使いこなそうとしています。私は今、ロードブロッキングを打った。私はリストを含むプログラムにテキストファイルを読み込み、各ヘッダを読み込むためのケースクラスを作成しました。私は(String、String)のマッピングをdoubleにすることに成功しましたが、これを代わりにstringを(string、double)にマッピングしたいと思います。関連するコードはここにある:Scala - 1つのキーを異なる型の複数の値にマッピングする

def averageofactions(): Map[(String,String), Double] = { 

    datafile.groupBy(d => (d.user, d.typeofaction)) 
.mapValues(averageof => averageof.map(_.amount).sum /averageof.length) 
} 

それは(ユーザーID、アクション)を与えるように、私は(特定のユーザーによる特定のアクションの平均量を)したいが、フォーマットされたものを私に与えている - 単に私のに対して>平均を、 >平均

アクション2 - - ように>

平均と

アクション1:

USERID1のようなリストが欲しいです。おそらくこれを行う最良の方法は、Map [String、(String、Double)]、またはおそらくマルチマップ/ハッシュマップを返すように変更することですが、これについてどうやって行くのかは分かりません。私は試しました:

def modifiedaverage(): Map[String, (List[String], Double)] = { 

    datafile.groupBy(d => (d.user)) 
.mapValues(averageof => (averageof.map(_.typeofaction),  averageof.map(_.amount).sum/averageof.length)) 

} 

しかし、ここでの出力はまったく変です。この機能を書き直して、私が望むものを私に与えることはできますか?

def averageofactions(): Map[String, Map[String, Double]] = { 
    datafile.groupBy(_.user) 
    .mapValues(_.groupBy(_.typeofaction) 
     .mapValues(averageof => averageof.map(_.amount).sum /averageof.length)) 
} 

また、あなたがこの「フラット化」をしたい場合:

+0

が見えますMap [String、(List [Strin g]、Double)] ''なぜなら、それぞれの "アクション"は独自の "値"を持っているからです。 –

答えて

2

あなたは出力がuserによってグループ分けの各結果にactionoftypeによってタイプMap[String, Map[String, Double]](マップのマップ)のことができます。グループのようにしたい場合(String, String, Double)タプルのシーケンス(としないマップ)に、次のことができます。あなたが `それは` `地図[文字列、地図[文字列、ダブル]]戻りたい、とないよう

def averageofactions(): Seq[(String, String, Double)] = { 
    datafile.groupBy(averageof => (averageof.user, averageof.typeofaction)) 
    .mapValues(averageof => averageof.map(_.amount).sum /averageof.length) 
    .map { case ((user, action), avg) => (user, action, avg) }.toSeq 
} 
+0

ああ私は見る!これは今、多くの意味があります。ありがとう! – user1587400

関連する問題