尝试通过平均值进行聚合,然后根据kdb中的平均值修剪观测值的异常值

尝试通过平均值进行聚合,然后根据kdb中的平均值修剪观测值的异常值,kdb,q-lang,Kdb,Q Lang,我试图按项目类型找到平均值,然后设置一个变量y,该变量接受该值: 如果x=0,则缺少值 y=x。然后舍入太大或太小的值: 如果x>0,x>mu,则设置y=mu 如果x0)和(x>mu) q) tab2:从tab2更新y:mu,其中(x可以在一行中完成: tab3:updatey:?[abs[x]>abs[mu];mu;x]from(通过tab2中的项目更新mu:avg x),其中x0您可以在一行中完成此操作: tab3:updatey:?[abs[x]>abs[mu];mu;x]from(通过t

我试图按项目类型找到平均值,然后设置一个变量y,该变量接受该值:

  • 如果x=0,则缺少值
  • y=x。然后舍入太大或太小的值:
  • 如果x>0,x>mu,则设置y=mu
  • 如果x<0,x 这是我尝试过的,但没有产生以下预期结果:

     tab2:([]items:`a`b`a`a`b; x:-6 8 0 -3 5)
     tabsum: select mu:avg x by items from tab2;
     tab2: update y:x from tab2
     tab2: update y:mu from tab2 where x > 0 and x > mu / get error after running above step
     tab2: update y:mu from tab2 where x < 0 and x <= mu
    
    与此数据相关:

    i) NaN是kdb中缺少值的适当类型吗?(
    NA
    不同于R中的
    NaN
    NULL
    )。我是根据我到目前为止所读到的来猜的

    ii)是否有更有效的代码将mu列放入
    tab2
    ?我猜,创建另一个表并合并并不高效(仍在学习kdb的基础知识)

    (iii) 如果我只是跑

    tab2:([]items:`a`b`a`a`b; x:-6 8 0 -3 5)
         tabsum: select mu:avg x by items from tab2;
         tab2: update y:mu from tab2 where x > 0 and x > mu
    
    我得到:

      items  x   mu   y
    1     a -6 -3.0 NaN
    2     b  8  6.5 6.5
    3     a  0 -3.0 NaN
    4     a -3 -3.0 NaN
    5     b  5  6.5 6.5
    
    第五行对我来说毫无意义。如果x
    iv)如何获得所需的结果(我发布的代码工作不正常)

    这可能不是最漂亮的解决方案,但似乎符合您的标准。我正在使用向量条件
    设置y的值:

    q)show tab3: update y:?[((x>0) and x>mu) or ((x<0) and x<=mu);mu;x] from update mu:avg x by items from tab2
    items x  mu  y  
    ----------------
    a     -6 -3  -3 
    b     8  6.5 6.5
    a     0  -3  0  
    a     -3 -3  -3 
    b     5  6.5 5
    
    最后一行的意外结果取决于执行顺序;q代码从右向左执行。因此:

    5>0 and 5>6.5
    
    实际上是指:

    5>(0 and 5>6.5)
    
    即:

    5>0
    
    结果是真的。要进行所需的比较,需要使用括号:

    q)(5>0) and 5>6.5
    0b
    
    您的代码块无法工作有几个原因。在第2行,不使用
    mu
    列更新
    tab2
    ;您只需创建一个新表。因此,当您尝试在第4行使用
    mu
    时,它不存在(这将导致错误)。在第3行,您将
    y
    的值设置为与
    x
    相同,但这也意味着相同的类型(整数)。然后,稍后当您尝试从
    mu
    y
    重置为浮点值时,您会得到一个
    类型的
    错误

    下面是一段与您的代码类似的代码:

    q)tab2:([]items:`a`b`a`a`b; x:-6 8 0 -3 5)
    q)tab2: update mu:avg x by items from tab2
    q)tab2: update y:"f"$x from tab2
    q)tab2: update y:mu from tab2 where (x>0) and (x> mu)
    q)tab2: update y:mu from tab2 where (x<0) and (x<= mu)
    q)tab2
    items x  mu  y  
    ----------------
    a     -6 -3  -3 
    b     8  6.5 6.5
    a     0  -3  0  
    a     -3 -3  -3 
    b     5  6.5 5
    
    q)表2:([]项:`a`b`a`a`b;x:-680-35)
    q) tab2:根据tab2中的项目更新mu:avg x
    q) tab2:更新y:“f”$x自tab2
    q) tab2:从tab2更新y:mu,其中(x>0)和(x>mu)
    
    q) tab2:从tab2更新y:mu,其中(x这可能不是最漂亮的解决方案,但似乎符合您的标准。我正在使用向量条件
    设置y的值:

    q)show tab3: update y:?[((x>0) and x>mu) or ((x<0) and x<=mu);mu;x] from update mu:avg x by items from tab2
    items x  mu  y  
    ----------------
    a     -6 -3  -3 
    b     8  6.5 6.5
    a     0  -3  0  
    a     -3 -3  -3 
    b     5  6.5 5
    
    最后一行的意外结果取决于执行顺序;q代码从右到左执行。因此:

    5>0 and 5>6.5
    
    实际上是指:

    5>(0 and 5>6.5)
    
    即:

    5>0
    
    其计算结果为true。要进行所需的比较,需要使用括号:

    q)(5>0) and 5>6.5
    0b
    
    代码块不起作用有几个原因。在第2行,您不使用
    mu
    列更新
    tab2
    ;您只需创建一个新表。因此,当您尝试在第4行使用
    mu
    时,它不存在(这将导致错误)。在第3行,您将
    y
    的值设置为与
    x
    相同,但这也意味着相同的类型(整数)。然后,当您尝试将
    y
    重置为
    mu
    中的浮点值时,您会得到一个
    类型的
    错误

    下面是一段与您的代码类似的代码:

    q)tab2:([]items:`a`b`a`a`b; x:-6 8 0 -3 5)
    q)tab2: update mu:avg x by items from tab2
    q)tab2: update y:"f"$x from tab2
    q)tab2: update y:mu from tab2 where (x>0) and (x> mu)
    q)tab2: update y:mu from tab2 where (x<0) and (x<= mu)
    q)tab2
    items x  mu  y  
    ----------------
    a     -6 -3  -3 
    b     8  6.5 6.5
    a     0  -3  0  
    a     -3 -3  -3 
    b     5  6.5 5
    
    q)表2:([]项:`a`b`a`a`b;x:-680-35)
    q) tab2:根据tab2中的项目更新mu:avg x
    q) tab2:更新y:“f”$x自tab2
    q) tab2:从tab2更新y:mu,其中(x>0)和(x>mu)
    
    q) tab2:从tab2更新y:mu,其中(x可以在一行中完成:


    tab3:updatey:?[abs[x]>abs[mu];mu;x]from(通过tab2中的项目更新mu:avg x),其中x0

    您可以在一行中完成此操作:


    tab3:updatey:?[abs[x]>abs[mu];mu;x]from(通过tab2中的项目更新mu:avg x),其中x0

    感谢链接和解释!有意义链接和解释!有意义