2011-04-13 57 views
1

ř版本2.11.1在Windows 7如何根據另一列定義的組來計算一列的排名?

32位I獲得的數據集,如下:

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_B的排名USER_A通過他們的分數:

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

很差標題 - 使用一個更適合您的問題,請你! – 2011-04-13 12:03:57

+1

我認爲你需要開始整理今天提供的各種答案,併爲自己嘗試。我自己和其他幾個人提供了大量的方法,您可以將數據拆分爲塊,對這些塊應用函數,然後重新組合結果。這些方法與其他所有方法一樣,可以推廣到這個Q. – 2011-04-13 12:11:51

+0

@Joris - 謝謝,那太好了! :-) – 2011-04-13 12:16:30

回答

2
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 
+0

那麼如何把它放到我的電腦?我嘗試write.table(),但失敗。 – PepsiCo 2011-04-13 12:46:08

+0

@ user677743你想在哪裏使用結果?你想要什麼格式的數據? – 2011-04-13 12:50:35

+0

謝謝!我現在明白了! – PepsiCo 2011-04-15 04:09:39

相關問題