应用函数出错

时间:2016-11-18 23:18:36

标签: r spotfire terr

我有一个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 AFFL_CO 5717 5717 MISC P 4 AFFL_CO 5718 5718 POWER S 5 AFFL_CO 1702 1702 POWER S 6 MAIN 6712 POWER P 7 MAIN 6702 MISC S 8 MAIN 5313 MISC P 9 MAIN 5312 POWER S 10 MAIN 6712

我想创建一个输出表,它是dtl表的副本,但根据查找表中多列的匹配添加了额外的GLACCT列。

逻辑是:如果GLAccount列为null,则从查找表(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&lt; - apply(currdld,1,function(x)findgl)

}

PEDLD&lt; - load_details(currdld)

我收到以下错误: IBCO Spotfire Statistics Services返回错误:as.data.frame.default中的错误(passed.args [[i]],stringsAsFactors = s:无法强制类&#39;&#34;功能&#34; &#39;进入data.frame&#39;。

1 个答案:

答案 0 :(得分:0)

你不能说出你的期望。如果你想要一行一行地应用该函数,你的一个列被命名为&#34; GLAccout&#34;然后你可以这样做:

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

或者:

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

但是对一个命名列的一个列的应用程序(这是&#34; 2&#34;将要执行的操作)的逐列应用是没有意义的。但是为了使这样的策略成功,你需要做一些测试,并且对于一些实际数据,我将从这个完全未经测试的修改开始:

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 
        }