2015-04-20 54 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

謝謝這對我有幫助.. –