使用Plyr从函数返回多个值

使用Plyr从函数返回多个值,r,function,dataframe,plyr,R,Function,Dataframe,Plyr,我对R相当陌生,所以请接受这个 我编写了一个函数,它接受4个参数并返回一个数据帧。压缩版本如下所示 Advantage <- function(tRos, tTat, cRos, cTat){ #case 1.1 tRos is lower if((tRos > 0 | cRos > 0) & cRos > tRos & cTat < tTat){ tRosAd <- (cRos - tRos) * cTat * -1

我对R相当陌生,所以请接受这个

我编写了一个函数,它接受4个参数并返回一个数据帧。压缩版本如下所示

Advantage <- function(tRos, tTat, cRos, cTat){
  #case 1.1 tRos is lower
  if((tRos > 0 | cRos > 0) & cRos > tRos & cTat < tTat){
    tRosAd <- (cRos - tRos) * cTat * -1
    tTatAd <- (tTat - cTat) * tRos
    r <- c(tRosAd, tTatAd, 1.1)
  }
  else if((tRos > 0 | cRos > 0) & cRos < tRos & cTat > tTat){
    #case 1.2 tRos is higher
    r <- Advantage(cRos, cTat, tRos, tTat)
    r <- r * -1
    r[3] <- 1.2
  }
  r <- data.frame(rosAd = r[1], tatAd = r[2], cat = r[3])
  return(r)
}

每个gvkey对应一个唯一的公司。我每年从每个部门(sic2)获取ros&tat中位数,并将该部门内的每家公司与给定年份该部门的中位数进行比较。

外部两个环路可以替换为一个
ddply
呼叫,内部两个环路可以替换为第二个。我保留了
tmp2
tmp3
名称,以显示它们在原始代码中对应的内容

library("plyr")
bDf <- ddply(aDf, .(year, sic2), function(tmp2) {
  medRos <- median(tmp2$ros)
  medTat <- median(tmp2$tat)
  ddply(tmp2, .(gvkey), function(tmp3) {
    Advantage(tmp3$ros, tmp3$tat, medRos, medTat)
  })
})
库(“plyr”)

bDf您可以提供一些示例数据来处理。。。目前,我假设每个子集有1行或多行,因此您的
Advantage
函数的
if
语句可能不会像您认为的那样……当然这是过去45年中每个上市公司的销售回报率和资产周转率数据。GVKEY代表着独特的公司。为什么不试着在更小的范围内重现你的问题呢。显然,速度在那个时候可能不会是个问题,但至少其他人能够看到输入和期望输出的清晰示例,并能够帮助您解决问题。
outPut <- Advantage(tmp2$ros, tmp2$tat, median(tmp2$ros), median(tmp2$tat))
      gvkey year   at   ni sic sales        roa        ros       tat sic2
17857  1266 1966 5.21 0.06 100  1.06 0.01151631 0.05660377 0.2034549   10
17858  1266 1967 5.78 0.31 100  1.28 0.05363322 0.24218750 0.2214533   10
17859  1266 1968 6.54 0.79 100  1.80 0.12079511 0.43888889 0.2752294   10
17860  1266 1969 6.77 0.22 100  1.88 0.03249631 0.11702128 0.2776957   10
17861  1266 1970 8.57 0.15 100  2.42 0.01750292 0.06198347 0.2823804   10
17862  1266 1971 9.02 0.18 100  3.09 0.01995565 0.05825243 0.3425721   10
library("plyr")
bDf <- ddply(aDf, .(year, sic2), function(tmp2) {
  medRos <- median(tmp2$ros)
  medTat <- median(tmp2$tat)
  ddply(tmp2, .(gvkey), function(tmp3) {
    Advantage(tmp3$ros, tmp3$tat, medRos, medTat)
  })
})