Как рассчитать рейтинг одного столбца по группам, определенным другим столбцом? - PullRequest
1 голос
/ 13 апреля 2011

R Версия 2.11.1 32-разрядная в Windows 7

Я получаю набор данных, как показано ниже:

USER_A USER_B SCORE
1        6      0.2
1        7      0.1
1        10     0.15
2        6      0.2
2        9      0.12
3        8      0.15
3        9      0.3

USER_A - 1: 3, а USER_B - 6:10. Теперь мне нужно вывести USER_A с рейтингом USER_B по их SCORE:

USER_A      ranking of USER_B
1  3  1  2  #the ranking of USER_B 6,7,10(which belong to USER_A 1)
2  2  1     #the ranking of USER_B 6,9(which belong to USER_A 2)
3  1  2     #the ranking of USER_B 8,9(which belong to USER_A 3)

на самом деле, мне просто нужно вывести рейтинг:

3 1 2
2 1
1 2

это расстроено, потому что длина каждого ряда разная! Я не мог сохранить их в матрице, а затем вывести их.

Может ли кто-нибудь помочь мне решить эту проблему?

1 Ответ

2 голосов
/ 13 апреля 2011
df <- read.table(con <- textConnection("USER_A USER_B SCORE
1        6      0.2
1        7      0.1
1        10     0.15
2        6      0.2
2        9      0.12
3        8      0.15
3        9      0.3
"), header = TRUE)
close(con)

Один из способов - разделить данные:

sdf <- with(df, split(SCORE, f = USER_A))
lapply(sdf, rank)

Последняя строка дает:

> lapply(sdf, rank)
$`1`
[1] 3 1 2

$`2`
[1] 2 1

$`3`
[1] 1 2

Альтернативой является использование aggregate() как в:

aggregate(SCORE ~ USER_A, data = df, rank)

Что возвращает:

> (foo <- aggregate(SCORE ~ USER_A, data = df, rank))
  USER_A   SCORE
1      1 3, 1, 2
2      2    2, 1
3      3    1, 2

Но вывод здесь немного другой, теперь у нас есть фрейм данных со вторым компонентом SCORE, представляющим собой список, точно так же, как и выводимая версия lapply():

> str(foo)
'data.frame':   3 obs. of  2 variables:
 $ USER_A: int  1 2 3
 $ SCORE :List of 3
  ..$ 0: num  3 1 2
  ..$ 1: num  2 1
  ..$ 2: num  1 2
> foo$SCORE
$`0`
[1] 3 1 2

$`1`
[1] 2 1

$`2`
[1] 1 2
...