2013-10-09 2 views
0

Я хочу создать столбец в R, который является просто средним значением всех предыдущих значений другого столбца. Для примера:R Создать колонку как текущую среднюю другую колонку

D 
    X 
1 1 
2 2 
3 3 
4 4 
5 5 
6 6 
7 7 
8 8 
9 9 
10 10 

Я хотел бы D $ Y, чтобы быть до среднем D $ X, то есть D $ Y является средним арифметическим всех предыдущих наблюдений D $ X. Я знаю, как это сделать, используя цикл for, перемещающийся по каждой строке, но есть ли более эффективный способ?

У меня есть большой набор данных и аппаратные средства, не соответствующие этой задаче!

Спасибо, Райан

+0

Здравствуйте и добро пожаловать в SO. Чтобы сделать воспроизводимый пример, вы можете использовать 'reproduce ()'. Инструкции здесь: http://bit.ly/SORepro - [Как сделать отличный R воспроизводимый пример] (http://bit.ly/SORepro) –

+0

@RicardoSaporta: Вы имеете в виду 'dput'? –

+0

@DavidRobinson нет, я имею в виду 'reproduce (.)';) –

ответ

5

Вы можете создавать накопительные средства вектора, как это:

set.seed(123) 
x<-sample(20) 
x 
## [1] 6 15 8 16 17 1 18 12 7 20 10 5 11 9 19 13 14 4 3 2 
xmeans<-cumsum(x)/1:length(x) 
xmeans 
## [1] 6.000000 10.500000 9.666667 11.250000 12.400000 10.500000 11.571429 
## [8] 11.625000 11.111111 12.000000 11.818182 11.250000 11.230769 11.071429 
## [15] 11.600000 11.687500 11.823529 11.388889 10.947368 10.500000 

Так D$Y<-cumsum(D$X)/1:nrow(D) должен работать.

+0

Большое спасибо, это работает очень хорошо, конечно, пробивая сквозной цикл по каждой строке :) – Ryan

+0

Что относительно отсутствующих данных? – Thomas

+1

@Thomas Хороший вопрос. Я не могу придумать способ сделать это в одной строке, но что-то вроде 'nax <-is.na (x); х [NaX] <- 0; cumsum (x)/cumsum (! nax) 'должен работать. – mrip

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