------------------------------------------------------------------------------------------------------------------------------
Problem Description:  (reproducible code below)
------------------------------------------------------------------------------------------------------------------------------
I cannot seem to get as.data.frame() to work as I would expect.

 Results2 seems to contain repeated column titles for each row, as well as a
row name 'investment' (which is not intended), like:
 Results2
[[1]]
           OutTotInvestment OutNumInvestments OutDolProf OutPerProf
OutNetGains OutLong OutShort OutInvestment OutStoploss OutComission OutPenny
OutVolume OutNumU OutAccDefn
investment            30000                 3       -450     -0.015
-0.0154    0.75     -0.5         10000      -0.015        2e-04
3      0.02       2          0
[[2]]
           OutTotInvestment OutNumInvestments OutDolProf OutPerProf
OutNetGains OutLong OutShort OutInvestment OutStoploss OutComission OutPenny
OutVolume OutNumU OutAccDefn
investment            30000                 3       -450     -0.015
-0.0154     1.5     -0.5         10000      -0.015        2e-04
3      0.02       2          0
...

When I try to apply 'as.data.frame', it concatenates incremental numbers to
the repeated row headers and gives:
as.data.frame(Results2)
           OutTotInvestment OutNumInvestments OutDolProf OutPerProf
OutNetGains OutLong OutShort OutInvestment OutStoploss OutComission OutPenny
OutVolume OutNumU OutAccDefn
investment            30000                 3       -450     -0.015
-0.0154    0.75     -0.5         10000      -0.015        2e-04
3      0.02       2          0
           OutTotInvestment.1 OutNumInvestments.1 OutDolProf.1 OutPerProf.1
OutNetGains.1 OutLong.1 OutShort.1 OutInvestment.1 OutStoploss.1
OutComission.1 OutPenny.1
investment              30000                   3         -450
-0.015       -0.0154       1.5       -0.5           10000
-0.015          2e-04          3
           OutVolume.1 OutNumU.1 OutAccDefn.1 OutTotInvestment.2
OutNumInvestments.2 OutDolProf.2 OutPerProf.2 OutNetGains.2 OutLong.2
OutShort.2 OutInvestment.2
investment        0.02         2            0
30000                   3         -450       -0.015       -0.0154
0.75         -1           10000
...

which is a data frame of dimension 1 224, when I am looking for a data frame
like Results of dimension 16 14.


------------------------------------------------------------------------------------------------------------------------------
Reproducible code:
------------------------------------------------------------------------------------------------------------------------------
# --------------------------------------------------------------
# FUNCTION calcProfit
# --------------------------------------------------------------
calcProfit <- function(IterParam,  marketData, dailyForecast) #, long,
short, investment, stoploss, comission, penny, volume, numU, accDefn)
  {
    if (class(IterParam) == "numeric")
      {
        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"]
      } else {
          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)
  }


# 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))
       }
  }


Results2 <- apply(CombParam, 1, calcProfit, X, Y)

------------------------------------------------------------------------------------------------------------------------------

On Tue, Dec 23, 2008 at 11:15 AM, David Winsemius <dwinsem...@comcast.net>wrote:

>
> On Dec 23, 2008, at 10:56 AM, Brigid Mooney wrote:
>
> Thank you again for your help.
>>
>> snip
>
>>
>>
> -------------
>> With the 'apply' call, Results2 is of class list.
>>
>> Results2 <- apply(CombParam, 1, calcProfit, X, Y)
>>
>> -------------------------------------------------------------------------------------------------------
>>
>> How can I get convert Results2 from a list to a data frame like Results?
>>
>
> Have you tried as.data.frame() on Results2? Each of its elements should
> have the proper structure.
>
> You no longer have a reproducible example, but see this session clip:
> > lairq <- apply(airquality,1, function(x) x )
> > str(lairq)
>  num [1:6, 1:153] 41 190 7.4 67 5 1 36 118 8 72 ...
>  - attr(*, "dimnames")=List of 2
>  ..$ : chr [1:6] "Ozone" "Solar.R" "Wind" "Temp" ...
>  ..$ : NULL
> > is.data.frame(lairq)
> [1] FALSE
> > is.data.frame(rbind(lairq))
> [1] FALSE
> > is.data.frame( as.data.frame(lairq) )
> --
> David Winsemius
>

        [[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.

Reply via email to