创建数据框的特定列中每个第n个对象的平均值

时间:2014-06-30 14:40:36

标签: r average

我正在尝试使用以下代码平均数据框中特定列的每个第n个对象。我知道使用for循环在计算上是低效的。这就是为什么我想问一下是否有更有效的方法来创建每第n行的平均值?我的数据看起来有点像这样。

set.seed(6218)
n <- 8760
s1 <- sample(30000:70000, n)
s2 <- sample(0:10000, n)
inDf <- cbind(s1, s2)

编辑:

我这样打电话给h_average: h_average(inDf,24,1,1) 这意味着我平均每个第一点&#34;每一个&#34; 24点子集。所以积分1,25,49,73,......我也只为第一列做这个。

提前致谢, BenR

#' h_average
#' 
#' Computing the average of every first, second, third, ... hour of the day/week
#' 
#' @param data merged data
#' @param tstep hour-step representing the number of hours for a day/week
#' @param h hour, which should be averaged. Should be between 1 - 24/1 - 168.
#' @param x column number
#' @return mean average of the specific hour
h_average <- function(data, tstep, h, x) {
  sum_1 <- 0
  sum_2 <- 0
  mean  <- 0

  for (i in seq(h, nrow(data), tstep)){
    if(data[i,x]){
      sum_1 <- sum_1 + 1
      sum_2 <- sum_2 + data[i,x]
    }
  }
  mean <- sum_2/sum_1
  return(mean)
}

2 个答案:

答案 0 :(得分:2)

只需使用rowMeans和子集的组合。如下所示:

n = 5
rowMeans(data[seq(1, nrow(data), n),])

或者,您可以使用apply

## rowMeans is better, but 
## if you wanted to calculate the median (say)
## Just change mean to median below
apply(data[seq(1, nrow(data), n),], 1, mean)

答案 1 :(得分:1)

如果问题是如何重现h_average但没有循环那么

1)colMeans 试试这个:

# assume inDf and h_average as defined in the question

tstep <- 24
h <- x <- 1

h_average(inDf, tstep, h, x)
##       s1 
## 49299.09 

# same but without loop
colMeans(inDf[seq(h, nrow(inDf), tstep), x, drop = FALSE])
##       s1 
## 49299.09 

如果x是列号的向量,例如, x = 1:2

1a)此变体也有效:

colMeans(inDf[seq_len(tstep) == h, x, drop = FALSE])

2)聚合另一种可能性是:

aggregate(DF[x], list(h = gl(tstep, 1, nrow(inDf))), mean)[h, ]

,其优点是xh都可以是矢量,例如

x <- 1:2
h <- 1:3

DF <- as.data.frame(inDF)
aggregate(DF[x], list(h = gl(tstep, 1, nrow(inDf))), mean)[h, ]
##   h       s1       s2
## 1 1 49299.09 4964.277
## 2 2 49661.34 5177.910
## 3 3 49876.77 4946.447

要获取所有h,请使用h <- 1:tstep或忽略[h, ]

注意:问题中定义的 InDf是一个矩阵,而不是其名称似乎暗示的数据框。

更新(1)中的一些改进,并添加了(1a)和(2)。