0

我正在处理 R 中只有 2 列但行数非常多的数据框。我想将我的数据框划分为每个“m”行的子集,并为数据框的每个分区找到这些 m 行中每一行的列中值的平均值,然后为包含“m”的所有分区返回这些平均值' 每行。

假设我的数据框是 y,列 'a' 和 'b' 并且在这种情况下我希望 'm' 为 1000。

我想找到平均值(y[i:i+999,2])

我想在所有行上取 i 的值并返回平均值,在这种情况下,每个块的 1000 个值在列“b”中

i=1
add=function(i,999){i=i+999}
z=return(i)
p=mean(y[z,2])

我想我做错了。有什么见解吗?

4

3 回答 3

2

zoo软件包rollapply对于应用这样的滚动功能非常有用。您可以使用sapply循环 a 的列data.frame并应用rollapply函数(sapply循环列表的元素,数据框实际上是列表的集合)。

希望这个例子有意义......

require(zoo)
## Sample data, two columns one million rows
df <- data.frame( A = runif(1e6) , B = runif(1e6) )

## Set desried 'chunk' size, i.e. the
## number of rows to find the mean of
## at once. Let's do 1e4, so we will 
## get 100 values back (1e6/1e4=1e2)
m = 1e4

## use sapply to loop across the columns, and
## apply rollapply to each column, which takes
## the mean of each set of 10,000 values
dfMean <- sapply( df , function(x) rollapply( x , width = m , by = m , align = "left" , FUN = mean ) )

nrow(dfMean)
#[1] 100

head(dfMean)
#            A         B
#[1,] 0.4966775 0.4992207
#[2,] 0.5013934 0.4986489
#[3,] 0.4994544 0.5009876
#[4,] 0.5020374 0.4979467
#[5,] 0.5049408 0.4999280
#[6,] 0.4969987 0.5018564
于 2013-05-11T11:50:23.570 回答
1

使用data.table将是您最快的选择,我认为by=“分组依据”的语法非常直观。

library(data.table)

# Sample data:
dt<-data.table(A=runif(1e6L), B=runif(1e6L), key="B")

# Note that keying by column B will order the rows by B;
# You can leave out the key if you don't care about the order
# or have already set it

# Average every 1000 records in column B:
dt[,list(avg=mean(B)),by=rep(1L:nrow(dt),each=1000L,length.out=nrow(dt))]

与解决方案超过 48 秒相比,这需要大约十分之一秒rollaply

于 2013-05-12T02:37:39.893 回答
0

如果我正确理解您的要求,您的列上需要一个移动平均线b

y<-data.frame(a=runif(2000),b=runif(2000))

m=1000
means=NULL;p=NULL
for(i in 1:(nrow(y)-m)){
  p=c(p,mean(y[i:(i+999),2]))
}

plot(p)

移动平均线

于 2013-05-11T10:04:45.990 回答