[R] switch function
arnaud Gaboury
arnaud.gaboury at gmail.com
Thu May 27 10:55:58 CEST 2010
Maybe should I be more precise. Here is what I have :
trades <-
structure(list(Trade.Status = c("DEL", "INS", "INS"), Instrument.Long.Name =
c("SUGAR NO.11", "CORN", "CORN"), Delivery.Prompt.Date = c("Jul/10",
"Jul/10", "Jul/10"), Buy.Sell..Cleared. = c("Sell", "Buy", "Buy"), Volume =
c(1L, 2L, 1L), Price = c("15.2500", "368.0000", "368.5000"),
Net.Charges..sum. = c(4.01, -8.64, -4.32)), .Names = c("Trade.Status",
"Instrument.Long.Name", "Delivery.Prompt.Date", "Buy.Sell..Cleared.",
"Volume", "Price", "Net.Charges..sum."), row.names = c(NA, 3L), class =
"data.frame")
Here is what I want :
tradesnew <-
structure(list(Trade.Status = c("DEL", "INS", "INS"), Instrument.Long.Name =
c("SUGAR NO.11", "CORN", "CORN"), Delivery.Prompt.Date = c("Jul/10",
"Jul/10", "Jul/10"), Buy.Sell..Cleared. = c("Buy", "Buy", "Buy"), Volume =
c(1L, 2L, 1L), Price = c("15.2500", "368.0000", "368.5000"),
Net.Charges..sum. = c(4.01, -8.64, -4.32)), .Names = c("Trade.Status",
"Instrument.Long.Name", "Delivery.Prompt.Date", "Buy.Sell..Cleared.",
"Volume", "Price", "Net.Charges..sum."), row.names = c(NA, 3L), class =
"data.frame")
From: Joris Meys [mailto:jorismeys at gmail.com]
Sent: Thursday, May 27, 2010 10:38 AM
To: arnaud Gaboury
Cc: r-help at r-project.org
Subject: Re: [R] data frame manipulation change elements meeting criteria
Off course. You put in a matrix to sapply, but sapply is for vectors. You
want to apply the switch command on every entry of the vector
trades$Buy.Sell..Cleared for which trades$Trade.Status equals "DEL". Why do
you try to put in a matrix with all variables for the observations where
status is DEL?
You should have done :
tradesnew<-sapply(trades$Buy.Sell..Cleared[which(trades$Trade.Status=="DEL")
],
switch,Sell="Buy",Buy="Sell")
Check the help files, and keep track of what goes in and out a function.
Cheers
Joris
On Thu, May 27, 2010 at 9:41 AM, arnaud Gaboury <arnaud.gaboury at gmail.com>
wrote:
Joris,
If i pass this line :
>tradesnew<-sapply(trades[which(trades$Trade.Status=="DEL"),],switch,Sel
>l="Buy",Buy="Sell")
Here is what I get :
> tradesnew
$Trade.Status
NULL
$Instrument.Long.Name
NULL
$Delivery.Prompt.Date
NULL
$Buy.Sell..Cleared.
[1] "Buy"
$Volume
[1] "Buy"
$Price
NULL
$Net.Charges..sum.
NULL
That's certainly not what I want.
From: Joris Meys [mailto:jorismeys at gmail.com]
Sent: Thursday, May 27, 2010 8:43 AM
To: arnaud Gaboury
Cc: r-help at r-project.org
Subject: Re: [R] data frame manipulation change elements meeting criteria
The loop is due to the switch statement, not the condition. Without
condition it would become:
for (i in 1:length(Y)){
new.vect[i]<-switch(
EXPR = X[i],
Sell="Buy",
Buy="Sell",
X[i])
}
You can make an sapply construct too off course :
new.vect <- sapply(X[which(Y=="DEL")],switch,Sell="Buy",Buy="Sell")
This will speed up things a little bit, but the effect is marginal.
Cheers
Joris
On Thu, May 27, 2010 at 8:33 AM, arnaud Gaboury <arnaud.gaboury at gmail.com>
wrote:
Thank you for the answer.
Is there any way to combine if() and switch() in one line? In my case,
something like :
>if(trade$Trade.Status=="DEL")switch(.....)
I would like to avoid the loop .
From: Joris Meys [mailto:jorismeys at gmail.com]
Sent: Wednesday, May 26, 2010 9:15 PM
To: arnaud Gaboury
Cc: r-help at r-project.org
Subject: Re: [R] data frame manipulation change elements meeting criteria
see ?switch
X<- rep(c("Buy","Sell","something else"),each=5)
Y<- rep(c("DEL","INS","DEL"),5)
new.vect <- X
for (i in which(Y=="DEL")){
new.vect[i]<-switch(
EXPR = X[i],
Sell="Buy",
Buy="Sell",
X[i])
}
cbind(new.vect,X,Y)
On Wed, May 26, 2010 at 7:43 PM, arnaud Gaboury <arnaud.gaboury at gmail.com>
wrote:
Dear group,
Here is my df :
trade <-
structure(list(Trade.Status = c("DEL", "INS", "INS"), Instrument.Long.Name =
c("SUGAR NO.11",
"CORN", "CORN"), Delivery.Prompt.Date = c("Jul/10", "Jul/10",
"Jul/10"), Buy.Sell..Cleared. = c("Sell", "Buy", "Buy"), Volume = c(1L,
2L, 1L), Price = c("15.2500", "368.0000", "368.5000"), Net.Charges..sum. =
c(4.01,
-8.64, -4.32)), .Names = c("Trade.Status", "Instrument.Long.Name",
"Delivery.Prompt.Date", "Buy.Sell..Cleared.", "Volume", "Price",
"Net.Charges..sum."), row.names = c(NA, 3L), class = "data.frame")
Here is what I want :
If trade$Trade.Status=="DEL": then if trade$buy.Sell..Cleared==Sell , change
it to "Buy", if trade$buy.Sell..Cleared==Buy, change it to "Sell".
If trade$Trade.Status=="INS", do nothing
I tried to work around with ifelse, but don't know how to deal with so many
conditions.
Any help is appreciated.
TY
______________________________________________
R-help at 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.
--
Joris Meys
Statistical Consultant
Ghent University
Faculty of Bioscience Engineering
Department of Applied mathematics, biometrics and process control
Coupure Links 653
B-9000 Gent
tel : +32 9 264 59 87
Joris.Meys at Ugent.be
-------------------------------
Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php
--
Joris Meys
Statistical Consultant
Ghent University
Faculty of Bioscience Engineering
Department of Applied mathematics, biometrics and process control
Coupure Links 653
B-9000 Gent
tel : +32 9 264 59 87
Joris.Meys at Ugent.be
-------------------------------
Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php
--
Joris Meys
Statistical Consultant
Ghent University
Faculty of Bioscience Engineering
Department of Applied mathematics, biometrics and process control
Coupure Links 653
B-9000 Gent
tel : +32 9 264 59 87
Joris.Meys at Ugent.be
-------------------------------
Disclaimer : http://helpdesk.ugent.be/e-maildisclaimer.php
More information about the R-help
mailing list