Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 计算给定区间上的Colwise均值_R_Apply_Mean - Fatal编程技术网

R 计算给定区间上的Colwise均值

R 计算给定区间上的Colwise均值,r,apply,mean,R,Apply,Mean,我有一个R中的数据帧,可以近似为: df <- data.frame(x = rep(1:5, each = 4), y = rep(2:6, each = 4), z = rep(3:7, each = 4)) > df x y z 1 1 2 3 2 1 2 3 3 1 2 3 4 1 2 3 5 2 3 4 6 2 3 4 7 2 3 4 8 2 3 4 9 3 4 5 10 3 4 5 11 3 4 5 12 3 4 5 13 4 5 6 14 4

我有一个R中的数据帧,可以近似为:

df <- data.frame(x = rep(1:5, each = 4), y = rep(2:6, each = 4), z = rep(3:7, each = 4))

> df
   x y z
1  1 2 3
2  1 2 3
3  1 2 3
4  1 2 3
5  2 3 4
6  2 3 4
7  2 3 4
8  2 3 4
9  3 4 5
10 3 4 5
11 3 4 5
12 3 4 5
13 4 5 6
14 4 5 6
15 4 5 6
16 4 5 6
17 5 6 7
18 5 6 7
19 5 6 7
20 5 6 7
我目前正在使用for循环(其中temp.coeff对应于上面指定的“5”):


my.means我真的认为
data.table
非常适合这种情况。它既快又容易

require("data.table")
dt <- data.table(df)

dt[,row.num:=.I]
dt[,lapply(.SD,mean),by=list(interval=cut(row.num,seq(0,nrow(dt),by=5)))]
#    interval   x   y   z
# 1:    (0,5] 1.2 2.2 3.2
# 2:   (5,10] 2.4 3.4 4.4
# 3:  (10,15] 3.6 4.6 5.6
# 4:  (15,20] 4.8 5.8 6.8
require(“data.table”)

dt我真的认为
data.table
在这种情况下非常有效。它既快又容易

require("data.table")
dt <- data.table(df)

dt[,row.num:=.I]
dt[,lapply(.SD,mean),by=list(interval=cut(row.num,seq(0,nrow(dt),by=5)))]
#    interval   x   y   z
# 1:    (0,5] 1.2 2.2 3.2
# 2:   (5,10] 2.4 3.4 4.4
# 3:  (10,15] 3.6 4.6 5.6
# 4:  (15,20] 4.8 5.8 6.8
require(“data.table”)

dt这是一种可能的解决方案,结合了
apply
sapply

apply(df, 2, function(x) sapply(seq(1,nrow(df),5), function(y) mean(x[y:(y+4)])))
#       x   y   z
#[1,] 1.2 2.2 3.2
#[2,] 2.4 3.4 4.4
#[3,] 3.6 4.6 5.6
#[4,] 4.8 5.8 6.8
@jbaums注释后编辑:根据所需的行为,您可能希望将
na.rm=TRUE
添加到
mean
计算中:

apply(df, 2, function(x) sapply(seq(1,nrow(df),5), function(y) mean(x[y:(y+4)], na.rm = TRUE)))

这是一种可能的解决方案,结合了
apply
sapply

apply(df, 2, function(x) sapply(seq(1,nrow(df),5), function(y) mean(x[y:(y+4)])))
#       x   y   z
#[1,] 1.2 2.2 3.2
#[2,] 2.4 3.4 4.4
#[3,] 3.6 4.6 5.6
#[4,] 4.8 5.8 6.8
@jbaums注释后编辑:根据所需的行为,您可能希望将
na.rm=TRUE
添加到
mean
计算中:

apply(df, 2, function(x) sapply(seq(1,nrow(df),5), function(y) mean(x[y:(y+4)], na.rm = TRUE)))

如果根据适当的运行索引进行聚合,
aggregate
可以执行此操作。结果中会出现另一列(可以删除)


如果根据适当的运行索引进行聚合,
aggregate
可以执行此操作。结果中会出现另一列(可以删除)


您想要按列平均值还是求和?看起来你算过总数了?噢!你说得对。请允许我更改。您要按列平均值还是求和?看起来你算过总数了?噢!你说得对。请允许我更改。如果也有很多行怎么办?非常好。刚刚更改了
cut
语句来处理很多行。如果也有很多行呢?非常好。刚刚更改了
cut
语句以处理大量行。将
na.rm=TRUE
添加到
mean
调用将确保在
nrow(df)%%5
不是0时计算最后一个子集行的平均值,尽管还不清楚在这些情况下需要什么行为(或者它们是否会出现).这是我使用的解决方案。非常感谢!效果很好。将
na.rm=TRUE
添加到
mean
调用将确保在
nrow(df)%%5
不是0时计算最后一个子集行的平均值,尽管不清楚在这些情况下需要什么行为(或者它们是否会出现)。这是我使用的解决方案。非常感谢!非常好。这个主题有一个变体:
aggregate(.~idx,data=cbind(df,idx=((seq.int(nrow(df))-1)%/%5)+1),mean)
它将使用行数不能被5平均整除的行数;只有最后一组会有更少的观察结果。这里有一个关于这个主题的变体:
aggregate(.~idx,data=cbind(df,idx=((seq.int(nrow(df))-1)%/%5)+1),mean)
它将处理行数不能被5平均整除的情况;只有最后一组的观察结果会更少。