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

16

我有一个数据框存储不同的值。样例:

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和函数式编程方面还是有些新手,所以我相信有更有效/简单的方法来实现这个目标。

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

2个回答

38

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

注意:这绝不是试图抹黑其他答案。它在大多数情况下起作用并且速度也很快。


不使用rowMeans函数会产生什么行为?NA会被视为0吗? - Antoine C.
4
请检查这个代码 mean(c(3, NA), na.rm=TRUE)(3+0)/2。其中,mean(c(3, NA), na.rm=TRUE) 是求一个包含 3 和缺失值的向量的平均值,na.rm=TRUE 表示在计算平均值时忽略缺失值。而 (3+0)/2 则是计算 3 和 0 的平均值。 - akrun

11

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

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

对于这种简单的情况,可以避免转换为矩阵并使用applyrowMeans


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接