使用Plyr从函数返回多个值
我对R相当陌生,所以请接受这个 我编写了一个函数,它接受4个参数并返回一个数据帧。压缩版本如下所示使用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
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)
})
})