2015-04-20 52 views
2

我是新来的斯卡拉马鞍,我有三列(客户名称,年龄和状态)在一个框架。我必须在列(年龄)中应用过滤器。如果任何超过18岁的客户年龄需要设置状态为“合格”,否则我需要提供“不合格”。斯卡拉马鞍过滤列值

代码:

f.col("age").filterAt(x => x > 18) //but how to update Status column 
+0

感谢,NorthCat –

+0

测试投票资格/饮料/烟雾可能应该是X> = 18 – richj

+0

richj,谢谢您回复。我需要根据年龄栏更改列值。 –

回答

0

框架是不可变的容器,所以它可能是更好的建立与比部分初始化帧开始完全初始化的值的框架。

import org.saddle._ 

object Test { 
    def main(args: Array[String]): Unit = { 
    val names: Vec[Any] = Vec("andy", "bruce", "cheryl", "dino", "edgar", "frank", "gollum", "harvey") 
    val ages: Vec[Any] = Vec(4, 89, 7, 21, 14, 18, 23004, 65) 

    def status(age: Any): Any = if (age.asInstanceOf[Int] >= 18) "eligible" else "noteligible" 

    def mapper(indexAge: (Int, Any)): (Int, _) = indexAge match { 
     case (index, age) => (index, status(age)) 
     } 

    val nameAge: Frame[Int, String, Any] = Frame("name" -> names, "age" -> ages) 
    val ageCol: Series[Int, Any]  = nameAge.colAt(1) 
    val eligible: Series[Int, Any]  = ageCol.map(mapper) 

    println("" + nameAge) 
    println("" + eligible) 

    val nameAgeStatus: Frame[Int, String, _] = nameAge.joinSPreserveColIx(eligible, how=index.LeftJoin, "status") 

    println("" + nameAgeStatus) 
    } 
} 

如果你真的需要从部分初始化帧开始,你可以随时删除未初始化的柱,并用正确的计算值添加回来。我认为一个Frame只包含一种类型的数据,而“Int”和“String”的通用类型是“Any”。这也会影响方法的类型签名,尽管您可能想要在没有类型信息的情况下内联它们。

我发现看着scaladoc帮了很大忙。

这是最后的println调用的输出:。

[8 x 3] 
     name age  status 
    ------ ----- ----------- 
0 -> andy  4 noteligible 
1 -> bruce 89 eligible 
2 -> cheryl  7 noteligible 
3 -> dino 21 eligible 
4 -> edgar 14 noteligible 
5 -> frank 18 eligible 
6 -> gollum 23004 eligible 
7 -> harvey 65 eligible 
+0

谢谢这对我有帮助.. –