2015-11-29 22 views
5

データフレームに異なる値を格納しています。サンプル:データフレーム内の2つの列の平均を計算する

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各行についてa$lowの平均値を格納し、新しい列a$meanを作成しています。

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に新しいと一般的にfunctionnal言語でので、私はより効率的/簡単な方法があることをかなり確信している:ここで

は私がいることを達成する方法でありますそれを達成する。

どのように賢明な方法を達成するには?

答えて

5

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

、このような簡単なケースでは、これはapplyまたはrowMeansを使用するためにmatrixに任意の変換を回避します。

11

我々はrowMeans

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

NOTEを使用することができます。NA値がある場合、たとえば

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

についてrowMeans

を使用することをお勧めしますと+

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

注:これは他の回答を汚すことはありません。それはほとんどの場合に機能し、高速です。あなたは本当に特別な機能を必要としない2つの数の平均値については

+0

rowMeansを使用しない場合の動作は何ですか? NAは0と見なされますか? – Lovy

+3

@LoveMetal 'mean(c(3、NA)、na.rm = TRUE)'と '(3 + 0)/ 2'をチェックしてください – akrun

関連する問題