当第一行变化时,计算r中数据帧中每个n行的平均值

时间:2014-12-17 14:04:45

标签: r dataframe mean

首先制作一些示例数据:

df = data.frame(matrix(rnorm(200), nrow=100))

df1=data.frame(t(c(25,34)))

每列的起始行不同。例如,在X1中我想从第25行开始,而在第34行从X2开始。然后,我想计算df中所有列的接下来50行的每5个值的平均值。

我是R的新手,所以这可能非常明显。任何人都可以提供一些建议,告诉我如何做到这一点吗?

2 个答案:

答案 0 :(得分:0)

不完全清楚,特别是你的代码的第二行,但我认为这可能接近你想要做的事情:

every_fifth_row <- df[seq(1, nrow(df), 5), ]
every_fifth_row
#             X1          X2
# 1  -0.09490455 -0.28417104
# 6  -0.14949662  0.12857284
# 11  0.15297366 -0.84428186
# 16 -1.03397309  0.04775516
# 21 -1.95735213 -1.03750794
# 26  1.61135194  1.10189370
# 31  0.12447365  1.80792719
# 36 -0.92344017  0.66639710
# 41 -0.88764143  0.10858376
# 46  0.27761464  0.98382526
# 51 -0.14503359 -0.66868956
# 56 -1.70208187  0.05993688
# 61  0.33828525  1.00208639
# 66 -0.41427863  1.07969341
# 71  0.35027994 -1.46920059
# 76  1.38943839  0.01844205
# 81 -0.81560917 -0.32133221
# 86  1.38188423 -0.77755471
# 91  1.53247872 -0.98660308
# 96  0.45721909 -0.22855622

rowMeans(every_fifth_row)
colMeans(every_fifth_row)

# Alternative
# apply(every_fifth_row, 1, mean) # Row-wise mean
# apply(every_fifth_row, 2, mean) # Column-wise mean

答案 1 :(得分:0)

您可以尝试Map

lst <- Map(function(x,y) {x1 <- x[y:length(x)]
                  tapply(x1,as.numeric(gl(length(x1), 5,
                                   length(x1))), FUN=mean)},
                                                     df, df1)
lst
# $X1
#        1           2           3           4           5           6 
#-0.16500158  0.11339623 -0.86961872 -0.54985564  0.19958461  0.35234983 
#       7           8           9          10          11          12 
#0.32792769  0.65989801 -0.30409184 -0.53264725 -0.45792792 -0.59139844 
#     13          14          15          16 
# 0.03934133 -0.38068187  0.10100007  1.21017392 

#$X2
#      1           2           3           4           5           6 
# 0.24525622  0.07367300  0.18733973 -0.43784202 -0.45756095 -0.45740178 
#      7           8           9          10          11          12 
#-0.54086152  0.10439072  0.65660937  0.70623380 -0.51640088  0.46506135 
#     13          14 
#-0.09428336 -0.86295101 

由于长度差异,最好将其保留为列表。但是,如果您需要matrix/data.frame,则可以通过NAs填充来使长度相等。

 do.call(cbind,lapply(lst, `length<-`,(max(sapply(lst, length)))))

更新

如果您只需要50行,请在y:(length(x)代码中将y:(y+49)更改为Map

数据

  set.seed(24)
  df <- data.frame(matrix(rnorm(200), nrow=100))
  df1 <- data.frame(t(c(25,34)))