[R] operation with if/else on a dataframe
Bernardo Rangel Tura
tura at centroin.com.br
Thu Oct 29 10:17:41 CET 2009
On Thu, 2009-10-29 at 01:47 -0700, Fran100681 wrote:
> Hi to all,
> I have this dataframe (I show the first six rows)
>
> >head(table)
>
> A R Fold.Change P.Value
> Count1 Count2
> 1 ENSRNOE00000000002_at 0 1.13 0.60 1
> 1
> 2 ENSRNOE00000000009_at 0 -1.04 0.73 3
> 3
> 3 ENSRNOE00000000020_at 0 -1.08 0.68 0
> 0
> 4 ENSRNOE00000000021_at 0 -1.31 0.20 1
> 2
> 5 ENSRNOE00000000023_at 0 -1.06 0.64 3
> 3
> 6 ENSRNOE00000000024_at 0 -1.14 0.40 3
> 3
>
> I would like to generate a function that determine for each row a new value
> (resulting in a new vector of values to add to the dataframe).
> The function should give for every row the same value showed in column "R".
> However,I need of this because not all the R-values reported in this table
> are correctly determined following the criteria mentioned below.
>
>
> These new values calculated by the function must be:
>
> 1)"UP"
> if all the following conditions are verified in a certain row:
> Fold.Change is >= +1.5,
> P.Value is < 0.05
> Count1 >= 2
>
> 2)"DOWN"
> if all the following conditions are verified in a certain row:
> Fold.Change is <= -1.5,
> P.Value is < 0.05
> Count2 >= 2
>
> 3) 0 if both of previous conditions are not verified
>
> So I have set these fllowing parameters (new objects) because I'll have to
> repeat this procedure to different dataframes in which the order of columns
> of interest might change (So I can change these parameters depending on the
> order of the columns in any different table)
>
> Fold.change <- 3 #(because in this table, Fold.Change value is the third
> column and so on...)
> P.Value <- 4
> Count1 <- 5
> Count2 <- 6
[ Quote text]
> This is my problem, I cannot use the function to recalculate values in
> R-column for all rows in my dataframe. I don't understand where is the
> problem, can someone help me?
> Thanks a lot!!
>
> Francesco
Francesco,
I think you solve this problem with a simple way.
Remember in R the most function and operations are vectorized so look
this example:
set.seed(123)
x<-rpois(20,5)
y<-rpois(20,15)
z<-rpois(20,10)
dta<-data.frame(x,y,z)
dta
dta$NEW<-ifelse(x>5 & y>15 & z>10,"UP",
ifelse(x<5 & y<15 & z<10,"DOWN",
"0"))
dta
First, I use ifelse command to simplify your nested conditional
situation.
Second, I know that R test this nested condition in order so the first
position will result test x[1],y[1] and z[1], the second postion will
result test x[2],y[2] and z[2] ...
The new vector result is the same order the original data.frame so I use
dta$NEW to create a new column in data.frame
--
Bernardo Rangel Tura, M.D,MPH,Ph.D
National Institute of Cardiology
Brazil
More information about the R-help
mailing list