我有一个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(),它可以自动帽的组向量至适当的长度.
如果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)
这应该工作.使用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)