compute a new variable

230 views
Skip to first unread message

Manel Salamero

unread,
May 27, 2012, 6:59:41 AM5/27/12
to Deducer
Is any way for computing a new variable from existing ones within
Deducer?

Ian Fellows

unread,
May 27, 2012, 1:38:47 PM5/27/12
to ded...@googlegroups.com
Data -> Recode Variables

or

Data -> Transform

philv...@gmail.com

unread,
Sep 5, 2012, 4:16:33 PM9/5/12
to ded...@googlegroups.com
I have a similar question, and haven't seen a way to do this in either Transform or Recode.  Basically I want to mathematically manipulate two variables to create a third, new variable.  So, if I have variables A and B, do A+B to create a new variable C. I'm also interested in creating new variables based on conditions in the current variables, so if A=1 and B=1, then new variable C=1.

Ian Fellows

unread,
Sep 5, 2012, 6:18:12 PM9/5/12
to ded...@googlegroups.com
This has come up a number of times in my conversations with users, and
I don't believe that there is a good GUI solution for such a general
concept (Though feel free to prove me wrong). You are going to have to
type things out.

We can do general variable computations with R in the console. Lets
start with some data:

data(mtcars)

Now, we can create a new variable "newvar" in mtcars which is the sum
of "mpg" and "cyl" with

mtcars$newvar <- mtcars$mpg + mtcars$cyl

note the dollar signs. They mean that you are looking in the
data.frame on the left hand side for the variable on the right hand
side. You can get a little notational simplification for statements
with many variable using within:

mtcars <- within(mtcars, newvar2 <- mpg + cyl)

Conditional computations can be done using ifelse

mtcars$condvar <- ifelse( mtcars$cyl==8 & mtcars$mpg < 18, "gas
guzzler", "Non gas guzzler")

this says that if a car is 8 cylenders and has under 18 mpg, then it
is a "gas guzzler".

all told, your mtcars should now look like:

mpg cyl disp hp drat wt qsec vs am gear
carb newvar newvar2 condvar
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4
4 27.0 27.0 Non gas guzzler
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4
4 27.0 27.0 Non gas guzzler
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4
1 26.8 26.8 Non gas guzzler
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3
1 27.4 27.4 Non gas guzzler
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3
2 26.7 26.7 Non gas guzzler
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3
1 24.1 24.1 Non gas guzzler
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3
4 22.3 22.3 gas guzzler
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4
2 28.4 28.4 Non gas guzzler
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4
2 26.8 26.8 Non gas guzzler
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4
4 25.2 25.2 Non gas guzzler
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4
4 23.8 23.8 Non gas guzzler
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3
3 24.4 24.4 gas guzzler
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3
3 25.3 25.3 gas guzzler
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3
3 23.2 23.2 gas guzzler
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3
4 18.4 18.4 gas guzzler
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3
4 18.4 18.4 gas guzzler
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3
4 22.7 22.7 gas guzzler
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4
1 36.4 36.4 Non gas guzzler
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4
2 34.4 34.4 Non gas guzzler
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4
1 37.9 37.9 Non gas guzzler
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3
1 25.5 25.5 Non gas guzzler
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3
2 23.5 23.5 gas guzzler
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3
2 23.2 23.2 gas guzzler
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3
4 21.3 21.3 gas guzzler
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3
2 27.2 27.2 Non gas guzzler
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4
1 31.3 31.3 Non gas guzzler
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5
2 30.0 30.0 Non gas guzzler
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5
2 34.4 34.4 Non gas guzzler
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5
4 23.8 23.8 gas guzzler
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5
6 25.7 25.7 Non gas guzzler
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5
8 23.0 23.0 gas guzzler
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4
2 25.4 25.4 Non gas guzzler

philv...@gmail.com

unread,
Sep 5, 2012, 7:46:23 PM9/5/12
to ded...@googlegroups.com
Thanks Ian, that works. I was surprised, given that you had implemented so much else in a similar way to SPSS, that the compute action was missing, but I bow to your expertise (obviously).

Ian Fellows

unread,
Sep 5, 2012, 8:07:28 PM9/5/12
to ded...@googlegroups.com
Well, think about what the SPSS "compute" dialog looks like? isn't it
mostly just a text field you type code into, kind of like a poor man's
console...

cheers,
ian

Bill Altermatt

unread,
Sep 6, 2012, 12:06:26 PM9/6/12
to ded...@googlegroups.com
I have thought too that a dialog like SPSS's Compute would be useful for simple operations.  Complex definitions of variables would still require syntax, but it still might be nice to implement a drag-and-drop interface to avoid problems remembering and correctly spelling variable names.  I dream of one that offers drop-down functions to choose from and might even show a histogram and descriptive stats of the proposed new variable.  For now, I designed a very simple dialog for a student project, which is attached to this message.  Just source the file and it will add a new option under the "Data" menu to combine variables.  Only a very few options are available:  summing, taking the product, averaging, subtracting, dividing.  

Bill
combineVariables.R

lui...@gmail.com

unread,
Jun 25, 2017, 8:34:29 PM6/25/17
to Deducer
Hi Bill
After 5 years, i just want to say thanks for your addin! 

Bruce Miller

unread,
Jun 26, 2017, 11:54:55 AM6/26/17
to ded...@googlegroups.com
Two questions:
First:
How can I remove "0" zeros from data sets so they are simply empty = null?
When I am calculating basic stats for bat calls I have been using this code:


BatStats<- Deducer::descriptive.table (vars = d
(Dur,TBC,Fmin,Fmax,BW,Fmean,Fk,Fc,Sc,Pmc),data= BatStats,func.names
=c("Valid N","Minimum","Maximum","Mean","St. Deviation","25th
Percentile","75th Percentile"),func.additional= list(p10=function(x)
quantile(x, c(0.10), na.rm=TRUE),p90=function(x) quantile(x, c(0.90),
na.rm=TRUE)))

The TBC variable is the Time Between call pulses of bat calls.
The way the bat call software generates these is to take the time
between the last pulse recorded and subtracts the time of the previous
(Start time) pule recorded. However at the beginning of a data file the
is no Start time resulting in a zero "0" output. I have been using
Excel with a filter to pre-process the data set to remove the "0" values.

If that is not done when the stats are run the results for TBC is
incorrect as there are no Zero values. If the zero are removed then
there is a min-max range possible.

Is there an easy way to remove the zeros from the DF once opened in the
data viewer before running the descriptive table?
I do not need to remove all the data only the zero values that are in
the TBC variable.

Second question is formatting output
Given the above code how can I change it so that when the results are
written...
## Write the results Change output name and directory for stats.
write.csv(BatStats,file="C:\\=Bat data working\\Acoustic
Parameters\\Dummy_Stats.csv")
...the column order is 10%, 25%,75% and 90%?

Now it is written 25%, 75%,10% 90% so that I still need to post process
in Excel (major PITA) by cutting the 10% column and inserting before the
25% column.

Thanks for any guidance.

Bruce

Ian Fellows

unread,
Jun 26, 2017, 12:28:43 PM6/26/17
to ded...@googlegroups.com
Hi bruce,

1. Use “recode variables” and enter 0 as the value and NA as the what you wish to recode into.

2. You may be looking for something like:
Deducer::descriptive.table (vars = d (mpg,cyl),data= mtcars,func.names =c("Valid N","Minimum","Maximum","Mean","St. Deviation"),func.additional= list(p10=function(x) quantile(x, c(0.10), na.rm=TRUE),p25=function(x) quantile(x, c(0.25), na.rm=TRUE),p75=function(x) quantile(x, c(0.75),na.rm=TRUE),p90=function(x) quantile(x, c(0.90),na.rm=TRUE)))

Best,
Ian
> --
>
> --- You received this message because you are subscribed to the Google Groups "Deducer" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to deducer+u...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

Bruce Miller

unread,
Jun 26, 2017, 2:59:00 PM6/26/17
to ded...@googlegroups.com
That was exactly what I needed.

Now I can dispense with Excel pre & post processing.

Many thanks.

Bruce
Reply all
Reply to author
Forward
0 new messages