2013-05-11 5 views
0

Я имею дело с dataframe в R, который имеет только 2 столбца, но очень большое количество строк. Я хочу разделить свой файл данных на подмножества строк «m» каждый и найти среднее значение значений в столбце для каждой из этих m строк для каждого деления кадра данных, а затем вернуть эти средние значения для всех разделов, содержащих «m 'ряды каждого.R кадры данных кадров

Скажите, что мой кадр данных имеет y с столбцами «a» и «b», и я хочу, чтобы «m» равнялся 1000 в этом случае.

Я хочу найти среднее (у [я: я + 999,2])

Я хотел бы взять значение я по всем строкам и возвращать средние значения, в этом случае каждый блок из 1000 значений в колонке «b»

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

Я думаю, что делаю это неправильно. Какие-нибудь идеи?

ответ

2

zoo пакет имеет rollapply, который очень полезен для применения качению функции как это. Вы можете использовать sapply для перебора столбцов data.frame и применить функцию rollapply (sapply петли над элементами списка, а dataframe - это набор списков).

Надеюсь, этот пример имеет смысл ...

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 
+0

На самом деле я получаю сообщение об ошибке при загрузке пакета zoo. не знаю почему. –

+0

Какая ошибка? вы его установили? Попробуйте 'install.packages (« зоопарк »); require (zoo) ' –

+0

Я использовал более старую версию R. zoo требует 3.0.0. разобрались :) –

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

+1

Если они хотят скользящую среднюю, они должны использовать 'filter'. Если вы хотите использовать цикл для этого, по крайней мере предварительно выделите 'p'. – Roland

+0

'p <-NULL' отлично работает, и я не уверен, хочет ли OP MA или просто средний размер блоков размером 1k. Кроме того, 'filter()' находится в пакете 'stats', поэтому загружаем пакет только для этого ... – Romain

+1

Вы находитесь в [Second Circle of Hell] (http://www.burns-stat.com/pages/ Репетитор/R_inferno.pdf). Статистика по умолчанию загружается по умолчанию. – Roland

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 раствора.

Смежные вопросы