2013-07-18 2 views
-1

Смотри, что я хочу сделать: [В Excel ясно и легко, но в РИ есть проблема ... :(]умножение матрицы R

Column A 1 2 3 4 5 
Column B 0 9 2 1 7 

Это мой настоящий «алгоритм»:

Column C 
(first value) = mean(Column A) = 3 
(second value) = ((mean(Column A)*4) + 0)/5 = 2,4 
(third value) = ((second value*4) + 9)/5 = 3,72 
etc. 

Итак, мы имеем:

# A B C 
# 1 1 0 3 
# 2 2 9 2,4 
# 3 3 2 3,72 
# 4 4 1 3,37 
# 5 5 7 2,90 

Это мой фактически код с предложением:

a <- c(1:5) 
b <- c(0,9,0,1,7,0) 

matrix <- data.frame(A=a,B=b) 
matrix <- c(mean(matrix$A), (cumsum(matrix$B) + (mean(matrix$A)*4))/5) 

Это решение: 2,4 4,2 4,2 4,4 5,8 (НЕПРАВИЛЬНО !!)

, конечно, R написать мне ошибку, что: «замена 6 рядов, данных имеет 5», но это не имеет значения ... Я только хочу знать, как мне это сделать?

+1

-1: см. [Что вы пытались?] (Http://whathaveyoutried.com) и http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible- пример – sgibb

+0

Добро пожаловать в SO. Как отметил Блейзи, хорошая практика - объяснить, что вы пробовали, и где вы застряли. Таким образом, мы можем помочь вам научиться, а не просто дать волшебное заклинание, которое решает вашу проблему. –

+0

Thx Richie Cotton. – Blazej

ответ

1

Вы можете использовать ?cumsum:

a <- 1:5 
b <- c(0, 9, 2, 1, 7) 

mean(a) + cumsum(b) 
# [1] 3 12 14 15 22 

UPDATE:

Кажется, что вы хотите запустить (взвешенное) скользящее среднее. Возможно, вам стоит взглянуть на TTR package.

Пожалуйста, найти простой подход ниже:

wma <- function(b, startValue, a=4/5) { 
    m <- double(length(b)+1) 
    m[1] <- startValue 
    for (i in seq(along=b)) { 
    m[i+1] <- a * m[i] + (1-a) * b[i] 
    } 
    return(m) 
} 

wma(b, mean(a)) 
# [1] 3.00000 2.40000 3.72000 3.37600 2.90080 3.72064 
+0

+1 хорошее решение –

+0

Sgibb вы не поняли мою проблему .... посмотрите, что я хочу сделать, пожалуйста :) – Blazej

+0

@Blazej: Ваша первая проблема была совершенно иной. Сначала я не мог понять вашу настоящую проблему, потому что вы не описали свою проблему. – sgibb

0

Это решает проблему:

mydf<-data.frame(A=1:5, B=c(0,9,2,1,7)) 
mydf$C<-cumsum(mydf$B)+mean(mydf$A) 

mydf 
# A B C 
# 1 1 0 3 
# 2 2 9 12 
# 3 3 2 14 
# 4 4 1 15 
# 5 5 7 22 

Надеется, что это помогает.

+0

Извините, Майк, нет +1 от меня, потому что это номинально точно так же, как и предыдущий ответ @sgibb дает ниже –

+0

Ха-ха, да, я думаю, я слишком долго написал код. Я должен был обновить свой browswer перед публикацией. :) –

+0

lol. Это раздражает, когда это происходит. BLNT! –

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