问题是计算每个类对应的每列的平均值。类编号在第一列中给出。
为了更清晰,我正在提供测试文件的一部分。
2 0.819039 -0.408442 0.120827
3 -0.063763 0.060122 0.250393
4 -0.304877 0.379067 0.092391
5 -0.168923 0.044400 0.074417
1 0.053700 -0.088746 0.228501
2 0.196758 0.035607 0.008134
3 0.006971 -0.096478 0.123718
4 0.084281 0.278343 -0.350414
所以任务是计算
1: avg(), avg(), avg()
.
.
.
我对Scala很新。经过大量的代码处理后,我想出了以下代码
val inputfile = sc.textFile ("testfile.txt")
val myArray = inputfile.map { line =>
(line.split(" ").toList)
}
var Avgmap:Map[String,List[Double]] = Map()
var countmap:Map[String,Int] = Map()
for( a <- myArray ){
//println( "Value of a: " + a + " " + a.size );
if(!countmap.contains(a(0))){
countmap += (a(0) -> 0)
Avgmap += (a(0) -> List.fill(a.size-1)(1.0))
}
var c = countmap(a(0)) + 1
val countmap2 = countmap + (a(0) -> c)
countmap = countmap2
var p = List[Double]()
for( i <- 1 to a.size - 1) {
var temp = (Avgmap(a(0))(i-1)*(countmap(a(0)) - 1) + a(i).toDouble)/countmap(a(0))
// println("i: "+i+" temp: "+temp)
var q = p :+ temp
p = q
}
val Avgmap2 = Avgmap + (a(0) -> p)
Avgmap = Avgmap2;
println("--------------------------------------------------")
println(countmap)
println(Avgmap)
}
当我执行此代码时,我似乎将结果分成两半的数据集。请帮我把它们组合起来。
编辑:关于我正在使用的变量。 countmap
会记录classnumber -> number of vectors encountered
。同样地,Avgmap
记录了与密钥对应的每列的平均值。
答案 0 :(得分:0)
首先,使用DataFrame API。在secont,你想要的只是一行
df.select(df.columns.map(c => mean(col(c))) :_*).show