R循环数据帧

时间:2013-05-11 09:48:57

标签: r dataframe mean

我正在处理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])

我认为我做错了。任何见解?

3 个答案:

答案 0 :(得分:2)

zoo包有rollapply,这对于应用这样的滚动功能非常有用。您可以使用sapply循环遍历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

答案 1 :(得分: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))]

这需要大约十分之一秒,而rollaply解决方案超过48秒。

答案 2 :(得分: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)

Moving Average