2015-11-29 36 views
5

Farklı değerler depolayan bir veri çerçevem ​​var. Örnek: Yapmak istediğim neBir veri çerçevesindeki iki sütunun ortalamasını hesaplayın

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$high ve her satır için a$low ortalamasını saklamak yeni bir sütun a$mean yaratıyor. İşte

Ben nasıl elde şudur: Ben R içine ve genel olarak functionnal dilde biraz yeniyim, bu yüzden daha verimli/basit yolu olduğunu eminim Ancak

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) 

Bunu başar.

Bunu en akıllı şekilde nasıl elde edebilirsiniz?

cevap

5

:

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

böyle kolay bir durum için, bu apply veya rowMeans kullanmak matrix yapılan dönüşümleri önler.

11

Biz rowMeans

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

NOT kullanabilirsiniz: Değerler NA varsa, örneğin

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

için rowMeans

kullanmak daha iyidir ve +

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

NOT: Diğer cevabı lekelemenin yolu bu değil. Çoğu durumda çalışır ve hızlıdır. Eğer gerçekten herhangi bir özel fonksiyonlar gerekmez iki sayı ortalamaları

+0

rowMeans kullanmamanın davranışı ne olurdu? NA 0 olarak alınacak mı? – Lovy

+3

@LoveMetal Sadece şunu kontrol edin: "(c (3, NA), na.rm = TRUE) ve" (3 + 0)/2 " – akrun

İlgili konular