2015-11-29 2 views
5

У меня есть dataframe, хранящий разные значения. Пример:Вычислить среднее из двух столбцов в dataframe

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 

То, что я хочу сделать, это создать новый столбец a$mean хранящий среднее a$high и a$low для каждой строки.

Вот как я достиг этого:

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) 

Однако я немного нового в R и в языках Функциональных вообще, поэтому я уверен, что есть более эффективный/простой способ достичь этого.

Как достичь этого самого умного пути?

ответ

5

Для среднего двух чисел вы на самом деле не нужны какие-либо специальные функции:

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

Для такого простого случая, это позволяет избежать каких-либо преобразований в matrix использовать apply или rowMeans.

11

Мы можем использовать rowMeans

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

ПРИМЕЧАНИЕ: Если есть NA значения, то лучше использовать rowMeans

Например

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

и используя +

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

ПРИМЕЧАНИЕ: Это не попытка запятнать другой ответ. Он работает в большинстве случаев и быстро.

+0

Каким будет поведение при использовании rowMeans? NA будет приниматься за 0? – Lovy

+3

@LoveMetal Просто проверьте это 'mean (c (3, NA), na.rm = TRUE)' и '(3 + 0)/2' – akrun