计算数据框中每13行的平均值

use*_*715 9 split r dataframe

我有一个2列和3659行的数据框 df

我试图通过平均此数据框中的每10行或13行来减少数据集,所以我尝试了以下方法:

# number of rows per group
n=13
# number of groups
n_grp=nrow(df)/n
round(n_grp,0)
# row indices (one vector per group)
idx_grp <- split(seq(df), rep(seq(n_grp), each = n))

# calculate the col means for all groups
res <- lapply(idx_grp, function(i) {
  # subset of the data frame
  tmp <- dat[i]
  # calculate row means
  colMeans(tmp, na.rm = TRUE)
})
# transform list into a data frame
dat2 <- as.data.frame(res)
Run Code Online (Sandbox Code Playgroud)

但是,我不能将行数除以10或13,因为数据长度不是拆分变量的倍数.所以我不确定应该做什么(我只想要计算最后一组的平均值 - 即使少于10个元素)

我也试过这个,但结果是一样的:

df1=split(df, sample(rep(1:301, 10)))
Run Code Online (Sandbox Code Playgroud)

bgo*_*dst 11

这是使用aggregate()和的解决方案rep().

df <- data.frame(a=1:12, b=13:24 );
df;
##     a  b
## 1   1 13
## 2   2 14
## 3   3 15
## 4   4 16
## 5   5 17
## 6   6 18
## 7   7 19
## 8   8 20
## 9   9 21
## 10 10 22
## 11 11 23
## 12 12 24
n <- 5;
aggregate(df,list(rep(1:(nrow(df)%/%n+1),each=n,len=nrow(df))),mean)[-1];
##      a    b
## 1  3.0 15.0
## 2  8.0 20.0
## 3 11.5 23.5
Run Code Online (Sandbox Code Playgroud)

该溶液用于处理的非整除的问题的重要组成部分nrow(df)n被指定len的参数(实际上是完整的参数名称是length.out的)rep(),它可以自动帽的组向量至适当的长度.


Ric*_*rta 7

如果df是data.table,您可以使用%/%以进行分组

library(data.table)
setDT(df)
n <- 13 # every 13 rows
Run Code Online (Sandbox Code Playgroud)
df[, mean(z), by= (seq(nrow(df)) - 1) %/% n]
Run Code Online (Sandbox Code Playgroud)

如果您想要每个第n行,请使用%%而不是%/%

df[, mean(z), by= (seq(nrow(df)) - 1) %% n]
Run Code Online (Sandbox Code Playgroud)


Vlo*_*Vlo 5

这应该工作.使用n = 13将13行聚集在一起.如果您有27行,您将获得大小为13,13,1的组.

n.colmeans = function(df, n = 10){
    aggregate(x = df,
              by = list(gl(ceiling(nrow(df)/n), n)[1:nrow(df)]),
              FUN = mean)
}

n.colmeans(state.x77, 10)

  Group.1 Population Income Illiteracy Life Exp Murder HS Grad Frost     Area
1       1     4892.8 4690.8       1.44   70.508   9.53   53.63  75.1 116163.6
2       2     3570.5 4419.4       1.12   71.110   7.07   53.35  99.8  44406.6
3       3     3697.9 4505.5       0.93   70.855   6.64   55.25 131.7  60873.0
4       4     5663.9 4331.2       1.33   70.752   7.12   49.59 103.6  56949.5
5       5     3407.0 4232.1       1.03   71.168   6.53   53.72 112.1  75286.7
Run Code Online (Sandbox Code Playgroud)