我有一个存储不同值的数据帧。样品:
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$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)
然而,我对R和一般的功能语言有点新意,所以我非常确定有更有效/简单的方法来实现这一点。
如何以最聪明的方式实现这一目标?
答案 0 :(得分:17)
我们可以使用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
注意:这绝不是试图玷污其他答案。它适用于大多数情况,也很快。
答案 1 :(得分:6)
对于两个数字的平均值,您并不需要任何特殊功能:
a$mean = (a$high + a$low) / 2
对于这种简单的案例,这可以避免matrix
转换为使用apply
或rowMeans
。