Итак, я пытался заставить это работать, но по какой-то причине я просто не делаю никакого прогресса в этом. И я надеялся, что вы, ребята, поможете мне. В значительной степени у меня есть кадр данных, который я бы хотел получить в среднем для определенного диапазона значений, где эти значения взяты из других столбцов в одном и том же кадре данных для каждого пользователя.Средние значения, основанные на элементах из других столбцов
Итак, допустим, у меня есть этот фрейм данных.
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
Все, что приветствуется и ценится, спасибо.
предупреждение приходит, потому что 'за $ toot' не является скаляром. Я не могу заставить его работать даже при использовании 'a $ toot [1]', но это только потому, что 'ave' для меня чужая функция. Я видел 'by' (в решении @ Rcoster) чаще. – Frank
Я помню, как пытался ($ toot [1]), который работает для первого пользователя, но он будет применять то же значение для других пользователей. Таким образом, первое значение toot будет применяться ко всем пользователям, чего я не могу, потому что у каждого пользователя есть другое значение toot для начала. Спасибо за отладку проблемы. – rj2700