我正在处理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])
我认为我做错了。任何见解?
答案 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)