2016-11-18 52 views
-3

我有一个DTL表和查找表(GLMap)误差应用功能

DTL:

DEAL_TYPE DN_DIRECTION key COMPANY_CODE GLAccount 
POWER SALE  1 AFFL_CO 1702 
POWER PURCHASE 2 AFFL_CO 3702 
MISC SALE  3 AFFL_CO 5717 
MISC PURCHASE 4 AFFL_CO 5718 
POWER SALE  5 AFFL_CO 1702 
POWER SALE  6 MAIN  
POWER PURCHASE 7 MAIN  
MISC SALE  8 MAIN  
MISC PURCHASE 9 MAIN  
POWER SALE  10 MAIN  

查找表(GLAcctMap):

DealType DR_CR GLAccount Customer 
POWER P 3702 AFFL_CO 
POWER S 1702 AFFL_CO 
MISC P 5718 AFFL_CO 
MISC S 5717 AFFL_CO 
POWER P 6702 STD 
POWER S 6712 STD 
MISC P 5312 STD 
MISC S 5313 STD 

预期输出: DEAL_TYPE DN_DIRECTION键COMPANY_CODE GLAccount GLACCT POWER S 1 AFFL_CO 1702 1702 POWER P 2 AFFL_CO 3702 3702 MISC S 3 AF FL_CO 5717 5717 MISC第4页AFFL_CO 5718 5718 功率S 5 AFFL_CO 1702 1702 功率S 6 MAIN 6712 功率P 7 MAIN 6702 MISC S8中MAIN 5313 MISC第9页MAIN 5312 功率S 10 MAIN 6712

我想创建一个Output表,它是dtl表的副本,但是根据查找表中多列上的匹配添加额外的GLACCT列。逻辑是:如果GLAccount列为空,则从查找表(GLacctMap)中获取匹配的Account,否则将GLAccount编号放在新列中。

这里有一个功能我想:

load_details <- function(dld) { 

phys_fin = 0

findgl <- function(x){ 
    if(is.na(x$GLAccount) ) { 
      GLACCT <- GLacctMap[ match(paste(x$DEAL_TYPE, x$DN_DIRECTION, sep=":"), 
             paste(GLacctMap$DealType,GLacctMap$DR_CR,sep=":")), "GLAccount"]  
     } else { 

       GLACCT <- x$GLAccount 
     }  
    GLACCT 
    } 

DLD $ GLACCT < - 应用(currdld,1,函数(X)findgl)

}

PEDLD < - load_details(currdld)

我收到以下错误: IBCO的Spotfire Statistics Service中返回一个错误:“错误as.data.frame.default(passed.args [我],stringsAsFactors = S:不能强迫类' "功能" '转换成data.frame'。

+0

?干杯。 – scsimon

+1

我正在使用terr在spotfire中运行这个。 – Gerald

回答

0

你不会说你期待什么。如果通过该功能的排应用需要一个行和你的一列被命名为“GLAccout”,那么你可以这样做:

temptb$GLACCT <- apply(temptb, 1, function(x) findgl(x)) 

或者:

temptb$GLACCT <- apply(temptb, 1, findgl) 

但它是没有意义做按列应用程序(这是“2”将执行的操作)将函数添加到命名列中。但是,为了这样一个战略要成功,你需要做一些测试,并与一些实际数据我想这个没有经过充分测试修改启动:如果您没有在Spotfire使用TERR可以去除标签

findgl <- function(x){ 
     if(is.na(x$GLAccount) ) { # no way to be length 0 or null 
       GLACCT <- GLacctMap[ match(paste(dld$COMPANY_CODE, dld$DLT_DEAL_TYPE, dld$DN_DIRECTION, sep=":"), 
              paste(GLacctMap$DealType,GLacctMap$DR_CR,sep=":")), "GLAccount"]  
      } else{ 
       GLACCT <- x$GLAccount 
      }  
     GLACCT 
     } 
+0

感谢您的回复。当我尝试按照您的建议使用函数的任何一个调用时,出现以下错误:SpotfireData :: exportDataToSBDF(data,file = file)中的错误:列' GLACCT '列长度不一致。 – Gerald

+0

让我试着更好地解释。我想根据一个查找表在这个表(GLACCT)中添加一个列,该查找表具有已命名公司的特定值和其他值的默认值(STD)。是的,我希望逐行应用该功能。查找表(GLacctMap)中的一列是GLAccount。我想读取它包含的所有已命名公司的值,以及所有其他值的默认值,基于交易类型和DR_CR的基本表中当前行的匹配。 – Gerald

+1

如果您需要解释或修改问题的实质,恰当的位置就是问题主体中的一个[编辑]。获得测试答案的最佳方式是提供一个工作示例。鼓励响应者的最佳方式是提供有用的答案。 –