【问题标题】:Compute the mean of two columns in a dataframe计算数据框中两列的平均值
【发布时间】:2016-03-03 01:56:36
【问题描述】:

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

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 和一般的函数式语言有点陌生,所以我很确定有一种更有效/更简单的方法可以实现这一目标。

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

【问题讨论】:

    标签: r dataframe semantics


    【解决方案1】:

    我们可以使用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?
    • @LoveMetal 看看mean(c(3, NA), na.rm=TRUE) 和(3+0)/2
    【解决方案2】:

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

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

    对于这种简单的情况,这可以避免任何转换为​​matrix 以使用apply 或rowMeans。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 2017-07-07
      • 2021-12-12
      相关资源
      最近更新 更多