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?
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.
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
.