On Dec 23, 2008, at 9:55 AM, Brigid Mooney wrote:
I have used some of your advice in making some changes to my
function and function call before reposting.
Instead of nesting many 'for' loops, I have gotten to the point
where I only have one. (Also, please note, I am pasting the
function calcProfit at the end of this message as it is a bit long.)
This process works correctly, but still has a 'for' loop, which I
thought I would be able to avoid with 'apply'.
------------------------------------------------------------------------------------------------------------------
# Sample iteration parameters (these can be vectors of arbitrary
length)
# Need to iterate through all possible combinations of these
parameters
Param <- list(long=c(.75, 1.5),
short=c(-.5, -1),
investment=10000,
stoploss=c(-.015),
comission=.0002,
penny=3,
volume=c(.02, .01),
numU=2,
accDefn=0:1 )
CombParam <- expand.grid(Param)
# Create sample X and Y data frames for function call
Y <- data.frame(SymbolID=10:14, OpeningPrice = c(1,3,10,20,60),
ClosingPrice = c(2,2.5,11,18,61.5), YesterdayClose= c(1,3,10,20,60),
MinTrVol = rep(10000000, times=5))
X <- data.frame(SymbolID=10:14, weight = c(1, .5, -3, -.75, 2),
CPweight=c(1.5, .25, -1.75, 2, -1), noU = c(2,3,4,2,10))
for (i in 1:length(CombParam$long))
{
if(i==1)
{ Results <- calcProfit(CombParam[i,], X, Y)
} else {
Results <- rbind(Results, calcProfit(CombParam[i,], X, Y))
}
}
------------------------------------------------------------------------------------------------------------------
However, when I try to replace this for loop with 'apply', I get the
following result:
Results2 <- apply(CombParam, 1, calcProfit, X, Y)
Error in IterParam$long : $ operator is invalid for atomic vectors
apply is giving calcProfit a named numeric vector and then calcProfit
is trying to parse it with "$" which is an operator for lists. Try
serial corrects of the form:
long <- IterParam["long"]
That seemed to let the interpreter move on to the next error ;-)
> Results2 <- apply(CombParam, 1, calcProfit, X, Y)
Error in IterParam$short : $ operator is invalid for atomic vectors
--
David Winsemius
Any advice that anyone could provide would be much appreciated.
Here is the function which I am using:
------------------------------------------------------------------------------------------------------------------
calcProfit <- function(IterParam, marketData, dailyForecast) {
long <- IterParam$long
short <- IterParam$short
investment <- IterParam$investment
stoploss <- IterParam$stoploss
comission <- IterParam$comission
penny <- IterParam$penny
volume <- IterParam$volume
numU <- IterParam$numU
accDefn <- IterParam$accDefn
compareMarket <- merge(dailyForecast, marketData,
by.x="SymbolID", by.y="SymbolID")
weight <- ifelse(rep(accDefn, times=length(compareMarket
$weight))==1, compareMarket$weight, compareMarket$CPweight)
position <- ifelse((weight<=short & compareMarket$OpeningPrice >
penny & compareMarket$noU>=numU), "S",
ifelse((weight>=long & compareMarket$OpeningPrice > penny &
compareMarket$noU>=numU), "L", NA))
positionTF <- ifelse(position=="L" | position=="S", TRUE, FALSE)
estMaxInv <- volume*compareMarket$MinTrVol*compareMarket
$YesterdayClose
investbySymbol <- ifelse(positionTF==TRUE, ifelse(estMaxInv >=
investment, investment, 0))
opClProfit <- ifelse(position=="L", compareMarket$ClosingPrice/
compareMarket$OpeningPrice-1,
ifelse(position=="S", 1-compareMarket
$ClosingPrice/compareMarket$OpeningPrice, 0.0))
Gains <- investbySymbol*ifelse(opClProfit <= stoploss, stoploss,
opClProfit)
ProfitTable <- data.frame(SymbolID=compareMarket$SymbolID,
investbySymbol, Gains, percentGains=Gains/investbySymbol,
LessComm=rep(comission,
times=length(Gains)), NetGains=Gains/investbySymbol-2*comission)
AggregatesTable <- data.frame( OutTotInvestment = sum(ProfitTable
$investbySymbol, na.rm=TRUE),
OutNumInvestments = sum(ProfitTable$investbySymbol,
na.rm=TRUE)/investment, OutDolProf = sum(ProfitTable$Gains,
na.rm=TRUE),
OutPerProf = sum(ProfitTable$Gains, na.rm=TRUE)/
sum(ProfitTable$investbySymbol, na.rm=TRUE),
OutNetGains = sum(ProfitTable$Gains, na.rm=TRUE)/
sum(ProfitTable$investbySymbol, na.rm=TRUE)-2*comission, OutLong =
long,
OutShort = short, OutInvestment = investment, OutStoploss =
stoploss, OutComission = comission, OutPenny = penny, OutVolume =
volume,
OutNumU = numU, OutAccDefn = accDefn )
return(AggregatesTable)
}
------------------------------------------------------------------------------------------------------------------
On Mon, Dec 22, 2008 at 4:32 PM, David Winsemius <dwinsem...@comcast.net
> wrote:
I do agree with Dr Berry that your question failed on several
grounds in adherence to the Posting Guide, so this is off list.
Maybe this will give you guidance that you can apply to your next
question to the list:
> alist <- list("a","b","c")
> blist <- list("ab","ac","ad")
> expand.grid(alist, blist)
Var1 Var2
1 a ab
2 b ab
3 c ab
4 a ac
5 b ac
6 c ac
7 a ad
8 b ad
9 c ad
> apply( expand.grid(alist, blist), 1, function(x) paste(x[1], x[2],
sep=""))
[1] "aab" "bab" "cab" "aac" "bac" "cac" "aad" "bad" "cad"
> clist <- list("AA","BB")
> apply(expand.grid(alist, blist, clist),1,function(x) paste(x[1],
x[2], x[3], sep=""))
[1] "aabAA" "babAA" "cabAA" "aacAA" "bacAA" "cacAA" "aadAA" "badAA"
"cadAA" "aabBB"
[11] "babBB" "cabBB" "aacBB" "bacBB" "cacBB" "aadBB" "badBB" "cadBB"
> dlist <- list(TRUE,FALSE)
> apply(expand.grid(alist, blist, clist, dlist),1,function(x)
paste(x[1], x[2], x[3], (x[4]), sep=""))[8:12]
[1] "badAATRUE" "cadAATRUE" "aabBBTRUE" "babBBTRUE" "cabBBTRUE"
This could get unwieldily if the length of the lists are
appreciable, since the number of rows will be the product of all the
lengths. On the other hand you could create a dataframe indexed by
the variables in expand.grid's output:
> master.df <- data.frame( expand.grid(alist, blist, clist, dlist),
results = apply(expand.grid(alist, blist,
clist,dlist),1,
function(x) paste(x[1], x[2],
x[3], (x[4]), sep="")))
--
David Winsemius
On Dec 22, 2008, at 3:33 PM, Charles C. Berry wrote:
On Mon, 22 Dec 2008, Brigid Mooney wrote:
Hi All,
I'm still pretty new to using R - and I was hoping I might be able
to get
some advice as to how to use 'apply' or a similar function instead
of using
nested for loops.
Unfortunately, you have given nothing that is reproducible.
The details of MyFunction and the exact structure of the list
objects are crucial.
Check out the _Posting Guide_ for hints on how to formulate a
question that will elecit an answer that helps you.
HTH,
Chuck
Right now I have a script which uses nested for loops similar to this:
i <- 1
for(a in Alpha) { for (b in Beta) { for (c in Gamma) { for (d in
Delta) {
for (e in Epsilon)
{
Output[i] <- MyFunction(X, Y, a, b, c, d, e)
i <- i+1
}}}}}
Where Output[i] is a data frame, X and Y are data frames, and Alpha,
Beta,
Gamma, Delta, and Epsilon are all lists, some of which are numeric,
some
logical (TRUE/FALSE).
Any advice on how to implement some sort of solution that might be
quicker
than these nested 'for' loops would be greatly appreciated.
Thanks!
[[alternative HTML version deleted]]
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Charles C. Berry (858) 534-2098
Dept of Family/Preventive
Medicine
E mailto:cbe...@tajo.ucsd.edu UC San Diego
http://famprevmed.ucsd.edu/faculty/cberry/ La Jolla, San Diego
92093-0901
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.