FAQ > 金融建模 > 建模问题 > 数组操作

Q:数组中如何实现前填与后填?    

简述
说明:当多表合并后,可能出现有些字段不齐为空(nil)的情况,想批量对这类空数据进行值填空,比如用特殊值替代,比如用最近的前面那个不为空的值补充或用最近的后面那个不为空的值来补充。本页面提供以下几种方式来实现该操作,供用户参考。
  • 在这里,作者封装了一个函数,fillNa_vvb(data,method),实现对表格data所有列中缺失值(nil)进行填充,支持前填,后填及自定义值填充。其参数:
    data:二维数据表格
    method: 'ffill' 用前一个非nil值去填充
        'bfill' 用下一个非nil值去填充
        其他值 指定一个值去填充,默认值填充为'-'
    函数:附件:fillNa_vvb(wubei).fun
    用户将该函数下载后并导成用户函数,可命名为fillNa_vvb后进行调用。
    场景:两个非包含关系的表进行全表合并,如何使结果显示为并集?
    //join无法实现列的合并,只能先合并主键序列后,再进行表连接    A:=array(('date':20190520T,'A1':11),
           ('date':20190521T,'A1':8),
           ('date':20190528T,'A1':2),
           ('date':20190530T,'A1':-1)
       );
       B:=array(('date':20190520T,'B1':3),
           ('date':20190521T,'B1':4),
           ('date':20190522T,'B1':2),
           ('date':20190523T,'B1':1),
           ('date':20190524T,'B1':6),
           ('date':20190527T,'B1':7),
           ('date':20190529T,'B1':8),
           ('date':20190530T,'B1':9)
       );
       C:=`array('date':A[:,'date'] union2 B[:,'date']);
       //注:C表放到最后,为避免被A,B表中的空值覆盖
       D:= select [2].*,[3].*,[1].*
         from C full join A on [1].['date']=[2].['date']
         full join B on [1].['date']=[3].['date']
         order by [1].['date'] end;

       return D;
    //返回表格:

    date
    A1B1
    2019-05-20113
    2019-05-2184
    2019-05-222
    2019-05-231
    2019-05-246
    2019-05-277
    2019-05-282
    2019-05-298
    2019-05-30-19


    范例1:若数据为空,则用’-’替代
    //对场景中的D表进行操作
    //访法1:调用mfind实现
    mfind(D,ifnil(mcell),nil,'-');
    return D;
    //方法2:调用fillNa_vvb实现
    return fillNa_vvb(D,'-');
    //或用 return return fillNa_vvb(D);
    //返回表格:

    date
    A1B1
    2019-05-20113
    2019-05-2184
    2019-05-22-2
    2019-05-23-1
    2019-05-24-6
    2019-05-27-7
    2019-05-282-
    2019-05-29-8
    2019-05-30-19



    范例2:若数据为空,则用上次非空值替代
    //对场景中的D表进行操作
    //方法1:
    D::begin
      if ifnil(mcell) then
        mcell:=D[mrow-1][mcol];
    end;
    return D;
    //方法2:
    cstr:=mcols(D,1);
    for i:=0 to length(cstr)-1 do
       update D set [cstr[i]]=refof([cstr[i]],1) where ifnil([cstr[i]]) end;
    return D;
    //方法3:
    return fillNa_vvb(D,'ffill');
    //返回表格:

    date
    A1B1
    2019-05-20113
    2019-05-2184
    2019-05-2282
    2019-05-2381
    2019-05-2486
    2019-05-2787
    2019-05-2827
    2019-05-2928
    2019-05-30-19


    范例3:若数据为空,则用下次非空值替代,调用fillNa_vvb函数
    //对场景中的D表进行操作
    return fillNa_vvb(D,'bfill');
    //返回表格:

    date
    A1B1
    2019-05-20114
    2019-05-2184
    2019-05-2222
    2019-05-2321
    2019-05-2426
    2019-05-2727
    2019-05-2828
    2019-05-29-18
    2019-05-30-19