【问题标题】:(q/kdb+) Generating an automated list(q/kdb+) 生成自动列表
【发布时间】:2018-04-06 22:04:52
【问题描述】:

示例 1)
我有下面的代码

5#10+1*2

生成

index   value
0       12
1       12
2       12
3       12
4       12

如何用索引替换数字“1”?
然后生成

5#10+index*2

index   value
0       10
1       12
2       14
3       16
4       18

更新示例 2)
现在,如果我有,让我们说

mult:5;
t:select from ([]numC:1 3 6 4 1;[]s:50 16 53 6 33);
update lst:(numC#'s) from t

最后一次更新会生成

 numC   s     lst
 1      50    50
 3      16    16 16 16
 6      53    53 53 53 53 53 53
 4      6     6 6 6 6
 1      33    33

如何按以下方式生成“lst”列?

 numC   s     lst
 1      50    50+0*mult
 3      16    16+0*mult 16+1*mult 16+2*mult
 6      53    53+0*mult 53+1*mult 53+2*mult 53+3*mult 53+4*mult 53+5*mult
 4      6     6+0*mult 6+1*mult 6+2*mult 6+3*mult
 1      33    33+0*mult

我尝试了类似的东西

update lst:(numC#'s + (til numC)*mult) from t

但我遇到了一个错误

ERROR: 'type

谢谢楼主

【问题讨论】:

    标签: kdb


    【解决方案1】:

    这是你要找的吗:

        q)x:5
        q)x#10+(til x)*2
        10 12 14 16 18
    

    http://code.kx.com/q/ref/arith-integer/#til

    【讨论】:

      【解决方案2】:

      您可以删除 # 并使用 til 简化为:

      q)10+2*til 5
      10 12 14 16 18
      

      使用til 将创建一个包含 5 个元素 (0->4) 的列表,因此您不需要从结果列表中获取 5 个元素。仅当您的索引列表大于 5 时才需要 Take。

      更新:

      对于您的第二个示例,以下内容应该有效:

      q)update lst:{y+x*til z}'[mult;s;numC] from t
      q)update lst:s+mult*til each numC from t
      numC s  lst
      -------------------------
      1    50 ,50
      3    16 16 21 26
      6    53 53 58 63 68 73 78
      4    6  6 11 16 21
      1    33 ,33
      

      【讨论】:

      • 感谢您的回复,您介意再看一下问题吗?我又加了一个疑问。
      • 更新了一个新的例子。
      【解决方案3】:

      我们可以通过多种方式实现这一目标:
      1)10+2*til 5

      2)(2*til 5) + 10

      / take 运算符:二元 take 函数创建列表。左参数指定计数和形状,右参数提供数据。 这对于从列表的前端或末尾进行选择很有用。 https://code.kx.com/wiki/Reference/NumberSign

      q)5#0 1 2 3 4 5 6 7 8      / take the first 5 items
      0 1 2 3 4
      q)-5#0 1 2 3 4 5 6 7 8     / take the last 5 elements
      4 5 6 7 8
      

      仅在需要时使用take 运算符#。
      假设我们有 10 个元素,其中我们需要输出 5 个元素,那么我们可以使用:
      5#10+2*直到10

      / til 函数接受一个非负整数参数 X 并返回前 X 个整数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多