-3

dtl テーブルとルックアップ テーブル (GLMap) があります。

詳細:

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_DN_DIRECTIONキーカンパニー_CODE GLACCT GLACCT POWERS 1 AFFL_CO 1702 1702 POWER P 2 AFFL_CO 3702 3702 MISC S 3 AFFL_CO 5717 5717 MISC P4 AFFL_CO 5718 5718 POWERS S 8 メイン 5313 その他 P 9 メイン 5312 電源 S 10 メイン 6712

dtl テーブルのコピーであるが、ルックアップ テーブルからの複数の列の一致に基づいて GLACCT 列が追加された出力テーブルを作成したいと考えています。

ロジックは次のとおりです。GLAccount 列が null の場合は、ルックアップ テーブル (GLacctMap) から一致するアカウントを取得します。それ以外の場合は、新しい列に 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 <- apply(currdld, 1, function(x) findgl )

}

PEDLD <- load_details(currdld)

次のエラーが表示されます: IBCO Spotfire Statistics Services がエラーを返しました:フレーム'。

4

1 に答える 1

0

あなたは期待していることを言いません。その関数を行ごとに適用する必要があり、列の 1 つに「GLAccout」という名前が付けられている場合は、次のようにすることができます。

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

または:

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

しかし、名前付き列に対して関数を列ごとに適用する (これは "2" が行うことです) ことは意味がありません。しかし、そのような戦略を成功させるには、いくつかのテストを行う必要があり、実際のデータを使用して、この完全にテストされていない変更から始めます。

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 
        }
于 2016-11-19T00:13:38.217 に答える