R 计算特定行模式的平均值

R 计算特定行模式的平均值,r,dataframe,row,sequence,mean,R,Dataframe,Row,Sequence,Mean,我有这样一个数据帧: V1 = paste0("AB", seq(1:48)) V2 = seq(1:48) test = data.frame(name = V1, value = V2) 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(t

我有这样一个数据帧:

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

test = data.frame(name = V1, value = V2)
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)
}
我想计算value列和特定行的平均值

行的模式非常复杂:

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

不太确定您需要的输出格式,但以下代码可以计算出您想要的格式

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

通过base R的一个想法是每4行创建一个分组变量,每12行拆分数据nrowtest/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

通过base R的一个想法是每4行创建一个分组变量,每12行拆分数据nrowtest/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 
还有另一种方式

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)
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)
}

既然你们说你们想要一个长长的平均值列表,我假设它也可以是一个向量,你们只需要所有这些值。你会得到这样的结果:

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

test = data.frame(name = V1, value = V2)
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)
}

谢谢你的帮助!另一个伟大的解决方案!谢谢你的帮助!另一个伟大的解决方案!这与这个问题有点过分吻合。例如,如果OP有26个以上的组,您将用完字母…@Sotos您是对的。该问题给出了一个带有“MeanA1”、“MeanD1”和“…”的示例,其中没有提到当超过26个组或第四行代码可以简单地删除时该怎么做。在函数旁边进行注释可能是最好的选择。这有点过于贴切了。例如,如果OP有26个以上的组,您将用完字母…@Sotos您是对的。问题给出了一个带有“MeanA1”、“MeanD1”和“…”的示例,其中没有提到当超过26个组或第四行代码可以简单地删除时该怎么做。在函数旁边进行注释可能是最好的选择。