我有一个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;。
答案 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
}