计算数据框中两列的平均值

Compute the mean of two columns in a 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$higha$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 和一般的函数式语言有点陌生,所以我很确定还有更多 efficient/simple 方法可以实现。

如何以最聪明的方式实现这一点?

我们可以使用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

注意:这不是试图玷污其他答案的方法。它在大多数情况下都有效,而且速度也很快。

对于两个数字的平均值,您实际上不需要任何特殊函数:

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

对于这种简单的情况,这避免了任何转换为​​ matrix 以使用 applyrowMeans