# 3. Basic Operations and Numerical Descriptions¶

We look at some of the basic operations that you can perform on lists of numbers. It is assumed that you know how to enter data or read data files which is covered in the first chapter, and you know about the basic data types.

## 3.1. Basic Operations¶

Once you have a vector (or a list of numbers) in memory most basic operations are available. Most of the basic operations will act on a whole vector and can be used to quickly perform a large number of calculations with a single command. There is one thing to note, if you perform an operation on more than one vector it is often necessary that the vectors all contain the same number of entries.

Here we first define a vector which we will call “a” and will look at how to add and subtract constant numbers from all of the numbers in the vector. First, the vector will contain the numbers 1, 2, 3, and 4. We then see how to add 5 to each of the numbers, subtract 10 from each of the numbers, multiply each number by 4, and divide each number by 5.

```
> a <- c(1,2,3,4)
> a
[1] 1 2 3 4
> a + 5
[1] 6 7 8 9
> a - 10
[1] -9 -8 -7 -6
> a*4
[1] 4 8 12 16
> a/5
[1] 0.2 0.4 0.6 0.8
```

We can save the results in another vector called *b*:

```
> b <- a - 10
> b
[1] -9 -8 -7 -6
```

If you want to take the square root, find e raised to each number, the logarithm, etc., then the usual commands can be used:

```
> sqrt(a)
[1] 1.000000 1.414214 1.732051 2.000000
> exp(a)
[1] 2.718282 7.389056 20.085537 54.598150
> log(a)
[1] 0.0000000 0.6931472 1.0986123 1.3862944
> exp(log(a))
[1] 1 2 3 4
```

By combining operations and using parentheses you can make more complicated expressions:

```
> c <- (a + sqrt(a))/(exp(2)+1)
> c
[1] 0.2384058 0.4069842 0.5640743 0.7152175
```

Note that you can do the same operations with vector arguments. For example to add the elements in vector a to the elements in vector b use the following command:

```
> a + b
[1] -8 -6 -4 -2
```

The operation is performed on an element by element basis. Note this is true for almost all of the basic functions. So you can bring together all kinds of complicated expressions:

```
> a*b
[1] -9 -16 -21 -24
> a/b
[1] -0.1111111 -0.2500000 -0.4285714 -0.6666667
> (a+3)/(sqrt(1-b)*2-1)
[1] 0.7512364 1.0000000 1.2884234 1.6311303
```

You need to be careful of one thing. When you do operations on vectors they are performed on an element by element basis. One ramification of this is that all of the vectors in an expression must be the same length. If the lengths of the vectors differ then you may get an error message, or worse, a warning message and unpredictable results:

```
> a <- c(1,2,3)
> b <- c(10,11,12,13)
> a+b
[1] 11 13 15 14
Warning message:
longer object length
is not a multiple of shorter object length in: a + b
```

As you work in R and create new vectors it can be easy to lose track of what variables you have defined. To get a list of all of the variables that have been defined use the ls() command:

```
> ls()
[1] "a" "b" "bubba" "c" "last.warning"
[6] "tree" "trees"
```

Finally, you should keep in mind that the basic operations almost always work on an element by element basis. There are rare exceptions to this general rule. For example, if you look at the minimum of two vectors using the min command you will get the minimum of all of the numbers. There is a special command, called pmin, that may be the command you want in some circumstances:

```
> a <- c(1,-2,3,-4)
> b <- c(-1,2,-3,4)
> min(a,b)
[1] -4
> pmin(a,b)
[1] -1 -2 -3 -4
```

## 3.2. Basic Numerical Descriptions¶

Given a vector of numbers there are some basic commands to make it
easier to get some of the basic numerical descriptions of a set of
numbers. Here we assume that you can read in the tree data that was
discussed in a previous chapter. It is assumed that it is stored in a
variable called *tree*:

```
> tree <- read.csv(file="trees91.csv",header=TRUE,sep=",");
> names(tree)
[1] "C" "N" "CHBR" "REP" "LFBM" "STBM" "RTBM" "LFNCC"
[9] "STNCC" "RTNCC" "LFBCC" "STBCC" "RTBCC" "LFCACC" "STCACC" "RTCACC"
[17] "LFKCC" "STKCC" "RTKCC" "LFMGCC" "STMGCC" "RTMGCC" "LFPCC" "STPCC"
[25] "RTPCC" "LFSCC" "STSCC" "RTSCC"
```

Each column in the data frame can be accessed as a vector. For example
the numbers associated with the leaf biomass (LFBM) can be found using
*tree$LFBM*:

```
> tree$LFBM
[1] 0.430 0.400 0.450 0.820 0.520 1.320 0.900 1.180 0.480 0.210 0.270 0.310
[13] 0.650 0.180 0.520 0.300 0.580 0.480 0.580 0.580 0.410 0.480 1.760 1.210
[25] 1.180 0.830 1.220 0.770 1.020 0.130 0.680 0.610 0.700 0.820 0.760 0.770
[37] 1.690 1.480 0.740 1.240 1.120 0.750 0.390 0.870 0.410 0.560 0.550 0.670
[49] 1.260 0.965 0.840 0.970 1.070 1.220
```

The following commands can be used to get the mean, median, quantiles, minimum, maximum, variance, and standard deviation of a set of numbers:

```
> mean(tree$LFBM)
[1] 0.7649074
> median(tree$LFBM)
[1] 0.72
> quantile(tree$LFBM)
0% 25% 50% 75% 100%
0.1300 0.4800 0.7200 1.0075 1.7600
> min(tree$LFBM)
[1] 0.13
> max(tree$LFBM)
[1] 1.76
> var(tree$LFBM)
[1] 0.1429382
> sd(tree$LFBM)
[1] 0.3780717
```

Finally, the *summary* command will print out the min, max, mean,
median, and quantiles:

```
> summary(tree$LFBM)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.1300 0.4800 0.7200 0.7649 1.0080 1.7600
```

The summary command is especially nice because if you give it a data frame it will print out the summary for every vector in the data frame:

```
> summary(tree)
C N CHBR REP LFBM
Min. :1.000 Min. :1.000 A1 : 3 Min. : 1.00 Min. :0.1300
1st Qu.:2.000 1st Qu.:1.000 A4 : 3 1st Qu.: 9.00 1st Qu.:0.4800
Median :2.000 Median :2.000 A6 : 3 Median :14.00 Median :0.7200
Mean :2.519 Mean :1.926 B2 : 3 Mean :13.05 Mean :0.7649
3rd Qu.:3.000 3rd Qu.:3.000 B3 : 3 3rd Qu.:20.00 3rd Qu.:1.0075
Max. :4.000 Max. :3.000 B4 : 3 Max. :20.00 Max. :1.7600
(Other):36 NA's :11.00
STBM RTBM LFNCC STNCC
Min. :0.0300 Min. :0.1200 Min. :0.880 Min. :0.3700
1st Qu.:0.1900 1st Qu.:0.2825 1st Qu.:1.312 1st Qu.:0.6400
Median :0.2450 Median :0.4450 Median :1.550 Median :0.7850
Mean :0.2883 Mean :0.4662 Mean :1.560 Mean :0.7872
3rd Qu.:0.3800 3rd Qu.:0.5500 3rd Qu.:1.788 3rd Qu.:0.9350
Max. :0.7200 Max. :1.5100 Max. :2.760 Max. :1.2900
RTNCC LFBCC STBCC RTBCC
Min. :0.4700 Min. :25.00 Min. :14.00 Min. :15.00
1st Qu.:0.6000 1st Qu.:34.00 1st Qu.:17.00 1st Qu.:19.00
Median :0.7500 Median :37.00 Median :18.00 Median :20.00
Mean :0.7394 Mean :36.96 Mean :18.80 Mean :21.43
3rd Qu.:0.8100 3rd Qu.:41.00 3rd Qu.:20.00 3rd Qu.:23.00
Max. :1.5500 Max. :48.00 Max. :27.00 Max. :41.00
LFCACC STCACC RTCACC LFKCC
Min. :0.2100 Min. :0.1300 Min. :0.1100 Min. :0.6500
1st Qu.:0.2600 1st Qu.:0.1600 1st Qu.:0.1600 1st Qu.:0.8100
Median :0.2900 Median :0.1700 Median :0.1650 Median :0.9000
Mean :0.2869 Mean :0.1774 Mean :0.1654 Mean :0.9053
3rd Qu.:0.3100 3rd Qu.:0.1875 3rd Qu.:0.1700 3rd Qu.:0.9900
Max. :0.3600 Max. :0.2400 Max. :0.2400 Max. :1.1800
NA's :1.0000
STKCC RTKCC LFMGCC STMGCC
Min. :0.870 Min. :0.330 Min. :0.0700 Min. :0.100
1st Qu.:0.940 1st Qu.:0.400 1st Qu.:0.1000 1st Qu.:0.110
Median :1.055 Median :0.475 Median :0.1200 Median :0.130
Mean :1.105 Mean :0.473 Mean :0.1109 Mean :0.135
3rd Qu.:1.210 3rd Qu.:0.520 3rd Qu.:0.1300 3rd Qu.:0.150
Max. :1.520 Max. :0.640 Max. :0.1400 Max. :0.190
RTMGCC LFPCC STPCC RTPCC
Min. :0.04000 Min. :0.1500 Min. :0.1500 Min. :0.1000
1st Qu.:0.06000 1st Qu.:0.2000 1st Qu.:0.2200 1st Qu.:0.1300
Median :0.07000 Median :0.2400 Median :0.2800 Median :0.1450
Mean :0.06648 Mean :0.2381 Mean :0.2707 Mean :0.1465
3rd Qu.:0.07000 3rd Qu.:0.2700 3rd Qu.:0.3175 3rd Qu.:0.1600
Max. :0.09000 Max. :0.3100 Max. :0.4100 Max. :0.2100
LFSCC STSCC RTSCC
Min. :0.0900 Min. :0.1400 Min. :0.0900
1st Qu.:0.1325 1st Qu.:0.1600 1st Qu.:0.1200
Median :0.1600 Median :0.1800 Median :0.1300
Mean :0.1661 Mean :0.1817 Mean :0.1298
3rd Qu.:0.1875 3rd Qu.:0.2000 3rd Qu.:0.1475
Max. :0.2600 Max. :0.2800 Max. :0.1700
```

## 3.3. Operations on Vectors¶

Here we look at some commonly used commands that perform operations on
lists. The commands include the *sort*, *min*, *max*, and *sum*
commands. First, the *sort* command can sort the given vector in
either ascending or descending order:

```
> a = c(2,4,6,3,1,5)
> b = sort(a)
> c = sort(a,decreasing = TRUE)
> a
[1] 2 4 6 3 1 5
> b
[1] 1 2 3 4 5 6
> c
[1] 6 5 4 3 2 1
```

The *min* and the *max* commands find the minimum and the maximum
numbers in the vector:

```
> min(a)
[1] 1
> max(a)
[1] 6
```

Finally, the *sum* command adds up the numbers in the vector:

```
> sum(a)
[1] 21
```