2015-11-29 12 views
5

Mam ramkę danych przechowującą różne wartości. Próbka:Obliczanie średniej z dwóch kolumn w ramce danych

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 

Co chcę zrobić, jest tworzenie nowej kolumny a$mean przechowywania średnią a$high i a$low dla każdego wiersza.

Oto jak osiągnąć to, że:

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) 

Jednak jestem trochę nowy w R oraz w językach functionnal w ogóle, więc jestem pewien, że jest bardziej skuteczny/prosty sposób osiągnąć to.

Jak osiągnąć ten najmądrzejszy sposób?

Odpowiedz

5

dla średniej dwóch liczb naprawdę nie potrzeba żadnych specjalnych funkcji:

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

Dla takiego łatwego przypadku, pozwala to uniknąć jakichkolwiek konwersji do matrix używać apply lub rowMeans.

11

Możemy użyć rowMeans

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

UWAGA: Jeśli istnieją NA wartości, to lepiej jest użyć rowMeans

Na przykład

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

i korzystania +

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

UWAGA: To nie jest żadna próba zniwelowania innej odpowiedzi. Działa w większości przypadków i jest szybki.

+0

Jakie byłoby zachowanie, aby nie używać rowMeans? NA będzie przyjmowane jako 0? – Lovy

+3

@LoveMetal Po prostu zaznacz to 'mean (c (3, NA), na.rm = TRUE)' i '(3 + 0)/2' – akrun

Powiązane problemy