我想计算每个n(在我的情况下每6个)行(或样本)的平均值和标准偏差。以下函数为我提供了每6行(96行给出16个平均值)的方法
colMeans(matrix(data.trim$X0, nrow=6))
我想对所有列执行此操作(总共1280个平均值)。我试过运行这个功能:
colMeans(matrix(data.trim, nrow=6))
但这根本不起作用,我收到以下错误消息:
colMeans中的错误(matrix(data.trim,nrow = 6)):'x'必须是数字
另外:警告信息:
在矩阵(data.trim,nrow = 6)中:数据长度[80]不是行数的子数倍或倍数[6]
答案 0 :(得分:4)
您可以使用sapply
:
sapply(iris[1:4], function(x) colMeans(matrix(x, nrow=6)))
Sepal.Length Sepal.Width Petal.Length Petal.Width
[1,] 4.950000 3.383333 1.450000 0.2333333
[2,] 4.850000 3.316667 1.483333 0.2000000
[3,] 5.183333 3.633333 1.316667 0.2500000
...
[23,] 6.533333 2.950000 5.583333 1.9333333
[24,] 6.516667 3.033333 5.316667 2.1333333
[25,] 6.383333 3.033333 5.266667 2.1333333
与手动创建前六行的平均值进行比较:
colMeans(iris[1:6, 1:4])
Sepal.Length Sepal.Width Petal.Length Petal.Width
4.9500000 3.3833333 1.4500000 0.2333333
如果给出正确的aggregate
参数,您也可以使用by
执行此操作:
aggregate(iris[1:4], by=list((seq(nrow(iris))-1) %/% 6), FUN=mean)
Group.1 Sepal.Length Sepal.Width Petal.Length Petal.Width
1 0 4.950000 3.383333 1.450000 0.2333333
2 1 4.850000 3.316667 1.483333 0.2000000
3 2 5.183333 3.633333 1.316667 0.2500000
...
这可以通过创建一个标识要平均的组的向量来实现:
(seq(nrow(iris))-1) %/% 6
[1] 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 8 8 8 8
[53] 8 8 9 9 9 9 9 9 10 10 10 10 10 10 11 11 11 11 11 11 12 12 12 12 12 12 13 13 13 13 13 13 14 14 14 14 14 14 15 15 15 15 15 15 16 16 16 16 16 16 17 17
[105] 17 17 17 17 18 18 18 18 18 18 19 19 19 19 19 19 20 20 20 20 20 20 21 21 21 21 21 21 22 22 22 22 22 22 23 23 23 23 23 23 24 24 24 24 24 24
sapply
解决方案返回一个矩阵,而aggregate
解决方案返回一个数据框,以防更有可能。
答案 1 :(得分:0)
我认为您收到Error
,warning
消息的可能原因是您直接将其应用于data.frame
。例如
set.seed(48)
d1 <- as.data.frame(matrix(sample(1:40, 80*96, replace=T), ncol=80))
rowMeans(matrix(d1, ncol=6, byrow=T))
#Error in rowMeans(matrix(d1, ncol = 6, byrow = T)) : 'x' must be numeric
#In addition: Warning message:
#In matrix(d1, ncol = 6, byrow = T) :
# data length [80] is not a sub-multiple or multiple of the number of rows [14]
您可以unlist
data.frame
res <- rowMeans(matrix(unlist(d1), ncol=6, byrow=T))
dim(res) <- c(96/6, 80)
length(res)
#[1] 1280
交叉检查@Matthew Lundberg的方法
的结果res1 <- sapply(d1, function(x) colMeans(matrix(x, nrow=6)))
all.equal(res,res1, check.attributes=F)
[1] TRUE