计算特定行模式的平均值

Calculate mean of specific row pattern

我有一个这样的数据框:

V1 = paste0("AB", seq(1:48))
V2 = seq(1:48)

test = data.frame(name = V1, value = V2)

我想计算值列和特定行的均值。

行的模式相当复杂:

Rows of MeanA1: 1, 5, 9
Rows of MeanA2: 2, 6, 10
Rows of MeanA3: 3, 7, 11
Rows of MeanA4: 4, 8, 12

Rows of MeanB1: 13, 17, 21
Rows of MeanB2: 14, 18, 22
Rows of MeanB3: 15, 19, 23
Rows of MeanB4: 16, 20, 24

Rows of MeanC1: 25, 29, 33
Rows of MeanC2: 26, 30, 34
Rows of MeanC3: 27, 31, 35
Rows of MeanC4: 28, 32, 36

Rows of MeanD1: 37, 41, 45
Rows of MeanD2: 38, 42, 46
Rows of MeanD3: 39, 43, 47
Rows of MeanD4: 40, 44, 48

如您所见,它从 4 个不同的点(1、13、25、37)开始,然后总是 +4,对于接下来的 4 个点,意味着它只是向下移动了 1 行。

我想在一个列表中输出所有这些方法。

有什么想法吗?注意:在此示例中,平均值当然始终是中间数,但我的真实 df 不同。

不太确定你需要的输出格式,但下面的代码无论如何可以计算出你想要的。

calc_mean1 <- function(x) mean(test$value[seq(x, by = 4, length.out = 3)])
calc_mean2 <- function(x){sapply(x:(x+3), calc_mean1)}
output <- lapply(seq(1, 37, 12), calc_mean2)
names(output) <- paste0('Mean', LETTERS[seq_along(output)]) # remove this line if more than 26 groups.
output

## $MeanA
## [1] 5 6 7 8

## $MeanB
## [1] 17 18 19 20

## $MeanC
## [1] 29 30 31 32

## $MeanD
## [1] 41 42 43 44

基于 R 的一个想法是为每 4 行创建一个分组变量,每 12 行拆分数据 (nrow(test) / 4) 并聚合以找到平均值,即

test$new = rep(1:4, nrow(test)%/%4)
lapply(split(test, rep(1:4, each = nrow(test) %/% 4)), function(i)
                                              aggregate(value ~ new, i, mean))

#    $`1`
#      new value
#    1   1     5
#    2   2     6
#    3   3     7
#    4   4     8

#    $`2`
#      new value
#    1   1    17
#    2   2    18
#    3   3    19
#    4   4    20

#    $`3`
#      new value
#    1   1    29
#    2   2    30
#    3   3    31
#    4   4    32

#    $`4`
#      new value
#    1   1    41
#    2   2    42
#    3   3    43
#    4   4    44

还有另一种方式。

fun <- function(DF, col, step = 4){
  run <- nrow(DF)/step^2
  res <- lapply(seq_len(step), function(inc){
    inx <- seq_len(run*step) + (inc - 1)*run*step
    dftmp <- DF[inx, ]
    tapply(dftmp[[col]], rep(seq_len(step), run), mean, na.rm = TRUE)
  })
  names(res) <- sprintf("Mean%s", LETTERS[seq_len(step)])
  res
}

fun(test, 2, 4)
#$MeanA
#1 2 3 4 
#5 6 7 8 
#
#$MeanB
# 1  2  3  4 
#17 18 19 20 
#
#$MeanC
# 1  2  3  4 
#29 30 31 32 
#
#$MeanD
# 1  2  3  4 
#41 42 43 44 

既然你说你想要一长串手段,我假设它也可以是一个向量,你只需要拥有所有这些值。你会得到这样的:

V1 = paste0("AB", seq(1:48))
V2 = seq(1:48)

test = data.frame(name = V1, value = V2)
meanVector <- NULL

for (i in 1:(nrow(test)-8)) {
  x <- c(test$value[i], test$value[i+4], test$value[i+8])
  m <- mean(x)
  meanVector <- c(meanVector, m)
}