2016-11-18 47 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

如果您需要解釋或修改問題的實質,恰當的位置就是問題主體中的一個[編輯]。獲得測試答案的最佳方式是提供一個工作示例。鼓勵響應者的最佳方式是提供有用的答案。 –