web-dev-qa-db-fra.com

Calculer la moyenne de deux colonnes dans une trame de données

J'ai une trame de données stockant différentes valeurs. Échantillon:

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

Ce que je veux faire, c'est créer une nouvelle colonne a$mean stockant la moyenne de a$high et a$low pour chaque ligne.

Voici comment j'y suis parvenu:

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)

Cependant, je suis un peu nouveau dans R et dans les langages fonctionnels en général, donc je suis presque sûr qu'il existe un moyen plus efficace/simple d'y parvenir.

Comment y parvenir de la manière la plus intelligente?

8
Antoine C.

Nous pouvons utiliser rowMeans

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

REMARQUE: s'il existe des valeurs NA, il est préférable d'utiliser rowMeans

Par exemple

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

et en utilisant +

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

REMARQUE: ce n'est pas possible d'essayer de ternir l'autre réponse. Il fonctionne dans la plupart des cas et est également rapide.

21
akrun

Pour la moyenne de deux nombres, vous n'avez pas vraiment besoin de fonctions spéciales:

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

Pour un cas aussi simple, cela évite toute conversion en matrix pour utiliser apply ou rowMeans.

9
Gregor Thomas