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

Ant*_* C. 7 r dataframe semantics

我有一个存储不同值的数据帧.样品:

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
Run Code Online (Sandbox Code Playgroud)

我想要做的,是创建一个新的列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)
Run Code Online (Sandbox Code Playgroud)

但是我对R和一般的函数语言有点新意,所以我很确定有一种更有效/简单的方法来实现它.

如何实现最聪明的方式?

akr*_*run 19

我们可以用 rowMeans

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

注意:如果有NA值,最好使用 rowMeans

例如

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

和使用 +

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

注意:这绝不是试图玷污其他答案.它适用于大多数情况,也很快.

  • @LoveMetal只需检查这个'mean(c(3,NA),na.rm = TRUE)`和`(3 + 0)/ 2` (4认同)

Gre*_*gor 8

对于两个数字的平均值,您并不需要任何特殊功能:

a$mean = (a$high + a$low) / 2
Run Code Online (Sandbox Code Playgroud)

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