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 であるため、4 番目の要素でユーザー 1 の値の平均を取り、その前の 2 要素で平均したいと考えています。

これは私がこれまでに持っているものです(これの多くのバリエーションと by 関数を使用):

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

どんなことでも大歓迎です、ありがとう。

4

2 に答える 2

3

でできますby()。お気に入り:

do.call(rbind, by(a, a$user, function(x) { cbind(x,deck=mean(x$values[x$toot[1]:(x$toot[1]-2)])) }))
于 2013-05-15T11:44:58.930 に答える
2
library(plyr)
ddply(a,.(user),function(df) {
       df$deck <- mean(df$values[(df$toot[1]-2):df$toot[1]]) 
       df
})
于 2013-05-15T11:45:01.083 に答える