[R] Dataframes: conditional calculations per row .
David Winsemius
dwinsemius at comcast.net
Tue Feb 10 01:11:15 CET 2009
One way. there may be better. The apply function will work with just
one row (or one column) at a time.
> DF
Month Week Estpassage MedFL
1 July 27 665 34
2 July 28 2232 35
3 July 29 9241 35
4 July 30 28464 35
5 Aug 31 41049 35
6 Aug 32 82216 35
7 Aug 33 230411 35
8 Aug 34 358541 35
9 Sept 35 747839 35
10 Sept 36 459682 36
11 Sept 37 609567 36
12 Sept 38 979475 36
13 Sept 39 837189 36
Build a function, say we call it switch.cond:
switch.cond <- function (x) {
if (x["Week"] >= 33) return( fun1(x) ) else
return( fun2(x) ) }
# Build two more functions to handle the dispatched rows
fun1 <-function(x){ cat("do function 1\n") }
# replace the cat-call with your first calculation
fun2 <-function(x){ cat("do function 2\n") }
# and use various x["<colname>"]'s as arguments
> apply(DF, 1, switch.cond)
do function 2
do function 2
do function 2
do function 2
do function 2
do function 2
do function 1
do function 1
do function 1
do function 1
do function 1
do function 1
do function 1
NULL
HTH:
David Winsemius
On Feb 9, 2009, at 5:11 PM, Jesús Guillermo Andrade wrote:
> Dear Sirs: I've been working with several variables in a dataframe
> that serve as part of a calculation that I need to perform in a
> different way depending on its value. Let me explain:
>
> The main dataframe is called llmcc
>
> llmcc : 'data.frame': 283 obs. of 11 variables:
> $ Area : num 308.8 105.6 51.4 51.4 52.9 ...
> $ mFondo : num 30.1 10 10.2 10.2 40.4 ...
> $ mFachada : num 22.95 6.7 4.72 4.72 4.72 ...
> $ Marca : Factor w/ 132 levels "AA_Movilnet",..: 11 32 82 82 32
> 32 32 32 32 32 ...
> $ Clase : int 8 4 1 1 1 1 1 1 12 1 ...
> $ Categoria: int 2 6 6 6 1 1 1 1 1 1 ...
> $ Phi : num 0.128 0.147 0.217 0.217 0.887 ...
> $ Rf : num 0.119 0.102 0.147 0.147 0.143 ...
> $ OldA : num 0.737 0.258 0.375 0.375 0.385 ...
> $ OldCondo : num 4436 1555 2260 2260 2318 ...
> $ NewA_Jon : num 1.069 0.368 0.256 0.256 0.264 ...
>
> I perform an initial operation using the original variables plus one
> numeric (Abase) that is external and has the same number of rows than
> the dataframe:
>
> alitemp <- ((Abase/llmcc$Clase)*PClase)+(((1/llmcc
> $Categoria)*Abase)*PCategoria)+((Abase*llmcc$Phi)*PPhi)+((Abase*llmcc
> $Rf)*PRf)
>
> So, after I obtain the results of this calculation, I append the
> series by creating an additional column within the original dataframe:
> l
> lmcc$Alitmp <- alitemp
>
> Problem is: I need to calculate a new column using a formula that has
> different structure depending on the values of llmcc$Clase, thus: for
> any given row of llmcc where llmcc$Clase is >= 10 i would have to
> perform some operations with other values in the same row that are, by
> definition, different than the ones I would need in case of lmcc$Clase
> is < 10.
> I've managed to break down the original dataframe by using subsets,
> and then performing the calculations, but then it is complicated to
> put the results in the same order of the original dataframe.
> I understand the workings of the control structures available in R but
> after reading the docs and help files, I can´t figure how to perform a
> conditional calculation row by row that checks first the values of a
> given column and then applies the corresponding operation to another
> column, so it outputs a series in the same exact order as the
> dataframe.
>
> Any light that you might share with me over this will be highly
> appreciated.
>
> Thanks in advance.
>
>
> Guillermo.
>
>
>
> Nunca le preguntes a un peluquero si necesitas un corte de pelo. Ley
> de Murray.
> ------------------------------
> Jesús Guillermo Andrade (Abg.)
> Gerente de Litigios y Corporativo. EDM. AC. API.
> Andrade & Moreno S.C. (http://amlegal.wordpress.com/)
>
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> 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.
More information about the R-help
mailing list