2015-11-29 25 views
5

Ho un dataframe che memorizza valori diversi. Esempio:Calcola la media di due colonne in un 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 

Quello che voglio fare, è la creazione di una nuova colonna a$mean memorizzare la media di a$high e a$low per ogni riga.

Ecco come ho realizzato che:

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) 

Comunque io sono un po 'nuova in R e in lingue functionnal in generale, quindi sono abbastanza sicuro che ci sia un modo più efficiente/semplice realizzarlo.

Come raggiungere questo il modo più intelligente?

risposta

5

Per la media di due numeri che non si ha realmente bisogno di alcune funzioni speciali:

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

Per un caso così facile, questo evita eventuali conversioni per matrix utilizzare apply o rowMeans.

11

Possiamo usare rowMeans

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

NOTA: Se ci sono NA valori, è meglio usare rowMeans

Per esempio

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

e utilizzando +

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

NOTA: non è assolutamente il caso di offuscare l'altra risposta. Funziona nella maggior parte dei casi ed è veloce pure.

+0

Quale sarebbe il comportamento di non utilizzare rowMeans? NA sarà preso come 0? – Lovy

+3

@LoveMetal Basta controllare questo 'mean (c (3, NA), na.rm = TRUE)' e '(3 + 0)/2' – akrun

Problemi correlati