scala - Scala:有一个过滤器,从另一列中选择值
问题描述
首先,我在 IntelliJ 上使用 Scala。有这个:
type | age
electric | 30
diesel | 24
gasoline | 28
diesel | 31
我想定义一个函数来获取列“age”的平均值,不包括“electric”类型。我不知道如何过滤一列,然后在维护过滤器的另一列中操作。现在,我做了这个:
def nonelectric (c: Seq[Df]): Double = {
val cars = c.map(k => k.type)
val nonelectriccars = cars.filterNot(cars=> cars == "electric")
var a:Double = 0.0
for (i <- nonelectriccars){
a += i
}
a/nonelectriccars.size.toDouble
}
但是,当然,我无法从“字符串”类型中得到平均值。我该如何修复我的代码?
解决方案
假设这Df
是一个class
带有字段的carType
,value
那么这是一个可能的解决方案:
def nonelectric(c: Seq[Df]): Double = {
val nonelectriccars =
c.collect { case df if df.carType != "electric" => df.value }
if (nonelectriccars.isEmpty) {
0.0
} else {
nonelectriccars.sum.toDouble / nonelectriccars.length
}
}
collect
是一种有用的方法,它可以将filter
运算和map
使用偏函数的运算结合起来。
如果 DF 实际上是一个数据框,那么这是一个 Spark 问题,我无能为力!