2013-05-15 3 views
0

Итак, я пытался заставить это работать, но по какой-то причине я просто не делаю никакого прогресса в этом. И я надеялся, что вы, ребята, поможете мне. В значительной степени у меня есть кадр данных, который я бы хотел получить в среднем для определенного диапазона значений, где эти значения взяты из других столбцов в одном и том же кадре данных для каждого пользователя.Средние значения, основанные на элементах из других столбцов

Итак, допустим, у меня есть этот фрейм данных.

a<-data.frame(user=c(rep(1,10),rep(2,10),rep(3,10)), 
values=c(1:30),toot=c(rep(4,10),rep(5,10),rep(3,10))) 

user values toot 
    1  1  4 
    1  2  4 
    1  3  4 
    1  4  4 
    1  5  4 
    1  6  4 
    1  7  4 
    1  8  4 
    1  9  4 
    1  10  4 
    2  11  5 
    2  12  5 
    2  13  5 
    2  14  5 
    2  15  5 
    2  16  5 
    2  17  5 
    2  18  5 
    2  19  5 
    2  20  5 
    3  21  3 
    3  22  3 
    3  23  3 
    3  24  3 
    3  25  3 
    3  26  3 
    3  27  3 
    3  28  3 
    3  29  3 
    3  30  3 

Итак, что я хотел бы, чтобы взять среднее значение между 2 элементов до этого гудок элемента через гудок элемента.

Вот что я ищу:

user values toot  deck 
    1  1  4  3 
    1  2  4  3 
    1  3  4  3 
    1  4  4  3 
    1  5  4  3 
    1  6  4  3 
    1  7  4  3 
    1  8  4  3 
    1  9  4  3 
    1  10  4  3 
    2  11  5  14 
    2  12  5  14 
    2  13  5  14 
    2  14  5  14 
    2  15  5  14 
    2  16  5  14 
    2  17  5  14 
    2  18  5  14 
    2  19  5  14 
    2  20  5  14 
    3  21  3  22 
    3  22  3  22 
    3  23  3  22 
    3  24  3  22 
    3  25  3  22 
    3  26  3  22 
    3  27  3  22 
    3  28  3  22 
    3  29  3  22 
    3  30  3  22 

Как вы видите, для пользователя 1, значение гудок этого пользователя является 4, поэтому я хочу, чтобы взять среднее значение 1 значений пользователя на 4 элемента и в среднем он с двумя элементами перед ним.

Это то, что я до сих пор (с большим количеством вариаций этого и с помощью функции):

a$deck<-ave(a$values,a$user,FUN=function(x) 
{ 
    z<-a$toot 
    y<-z-2 
mean(x[y:z]) 
}) 

Но проблема в том, что она не использует значение гудок, как это исходное положение. Вот предупреждающие сообщения:

> Warning messages: 
1: In y:z : numerical expression has 30 elements: only the first used 
2: In y:z : numerical expression has 30 elements: only the first used 
Error in mean(x[y:z]) : 
error in evaluating the argument 'x' in selecting a method for function 'mean': Error in x[y:z] : only 0's may be mixed with negative subscripts 

Все, что приветствуется и ценится, спасибо.

+0

предупреждение приходит, потому что 'за $ toot' не является скаляром. Я не могу заставить его работать даже при использовании 'a $ toot [1]', но это только потому, что 'ave' для меня чужая функция. Я видел 'by' (в решении @ Rcoster) чаще. – Frank

+2

Я помню, как пытался ($ toot [1]), который работает для первого пользователя, но он будет применять то же значение для других пользователей. Таким образом, первое значение toot будет применяться ко всем пользователям, чего я не могу, потому что у каждого пользователя есть другое значение toot для начала. Спасибо за отладку проблемы. – rj2700

ответ

2
library(plyr) 
ddply(a,.(user),function(df) { 
     df$deck <- mean(df$values[(df$toot[1]-2):df$toot[1]]) 
     df 
}) 
+0

Спасибо большое! Это работает. – rj2700

3

Вы можете сделать это с помощью by(). Как:

do.call(rbind, by(a, a$user, function(x) { cbind(x,deck=mean(x$values[x$toot[1]:(x$toot[1]-2)])) })) 
+0

Спасибо большое! Это работает. – rj2700

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