Calculate the average of two columns in a data frame

I have a data frame storing different values. Example:

a$open a$high a$low a$close 1.08648 1.08707 1.08476 1.08551 1.08552 1.08623 1.08426 1.08542 1.08542 1.08572 1.08453 1.08465 1.08468 1.08566 1.08402 1.08554 1.08552 1.08565 1.08436 1.08464 1.08463 1.08543 1.08452 1.08475 1.08475 1.08504 1.08427 1.08436 1.08433 1.08438 1.08275 1.08285 1.08275 1.08353 1.08275 1.08325 1.08325 1.08431 1.08315 1.08378 1.08379 1.08383 1.08275 1.08294 1.08292 1.08338 1.08271 1.08325 

What I want to do is create a new column a$mean , keeping the average value of a$high and a$low for each row.

Here is how I achieved this:

 highlowmean <- function(highs, lows){ m <- vector(mode="numeric", length=0) for (i in 1:length(highs)){ m[i] <- mean(highs[i], lows[i]) } return(m) } a$mean <- highlowmean(a$high, a$low) 

However, I'm a little new to R and functional languages ​​in general, so I'm sure there is a more efficient / easy way for this.

How to reach this smartest way?

+5
source share
2 answers

For the average of two numbers, you really don't need special functions:

 a$mean = (a$high + a$low) / 2 

In such a simple case, this avoids any matrix transformations for using apply or rowMeans .

+5
source

We can use rowMeans

  a$mean <- rowMeans(a[c('high', 'low')], na.rm=TRUE) 

NOTE. If there are NA values, it is better to use rowMeans

for instance

  a <- data.frame(High= c(NA, 3, 2), low= c(3, NA, 0)) rowMeans(a, na.rm=TRUE) #[1] 3 3 1 

and using +

  a1 <- replace(a, is.na(a), 0) (a1[1] + a1[2])/2 # High #1 1.5 #2 1.5 #3 1.0 

NOTE. This is not an attempt to tarnish another answer. It works in most cases and works fast.

+11
source

Source: https://habr.com/ru/post/1237039/


All Articles