34

さまざまな年のさまざまなアイテムの数を含むデータフレームがあります。

df <- data.frame(item = rep(c('a','b','c'), 3),
                 year = rep(c('2010','2011','2012'), each=3),
                 count = c(1,4,6,3,8,3,5,7,9))

そして、「year.rank」列を追加します。これは、特定の年内のアイテムのランクを示します。カウントが高いほど、「ランク」が高くなります。上記の場合、次のようになります。

  item year count year.rank
1    a 2010     1         3
2    b 2010     4         2
3    c 2010     6         1
4    a 2011     3         2
5    b 2011     8         1
6    c 2011     3         3
7    a 2012     5         3
8    b 2012     7         2
9    c 2012     9         1

を使用してデータフレーム全体に対してこれを実行できることはわかっていますが、年ごとorder(df$count)にどのように実行するかはわかりません。

4

5 に答える 5

35

rankそれを支援する関数があります:

transform(df, 
          year.rank = ave(count, year, 
                          FUN = function(x) rank(-x, ties.method = "first")))
  item year count year.rank
1    a 2010     1         3
2    b 2010     4         2
3    c 2010     6         1
4    a 2011     3         2
5    b 2011     8         1
6    c 2011     3         3
7    a 2012     5         3
8    b 2012     7         2
9    c 2012     9         1
于 2013-03-02T04:45:28.173 に答える
26

data.table練習用バージョン:

library(data.table)
DT <- as.data.table(df)
DT[,yrrank:=rank(-count,ties.method="first"),by=year]

   item year count yrrank
1:    a 2010     1      3
2:    b 2010     4      2
3:    c 2010     6      1
4:    a 2011     3      2
5:    b 2011     8      1
6:    c 2011     3      3
7:    a 2012     5      3
8:    b 2012     7      2
9:    c 2012     9      1
于 2013-03-02T05:02:15.757 に答える
9

order関数を使用して、

transform(dat, x= ave(count,year,FUN=function(x) order(x,decreasing=T)))
  item year count x
1    a 2010     1 3
2    b 2010     4 2
3    c 2010     6 1
4    a 2011     3 2
5    b 2011     8 1
6    c 2011     3 3
7    a 2012     5 3
8    b 2012     7 2
9    c 2012     9 1

編集

plyrここでも使用できます:

ddply(dat,.(year),transform,x =  order(count,decreasing=T))
于 2013-03-02T04:48:48.287 に答える
9

dplyrを使用すると、次のように実行できます。

library(dplyr) # 0.4.1
df %>% 
  group_by(year) %>% 
  mutate(yrrank = row_number(-count))

#Source: local data frame [9 x 4]
#Groups: year
#
#  item year count yrrank
#1    a 2010     1      3
#2    b 2010     4      2
#3    c 2010     6      1
#4    a 2011     3      2
#5    b 2011     8      1
#6    c 2011     3      3
#7    a 2012     5      3
#8    b 2012     7      2
#9    c 2012     9      1

それは次と同じです:

df %>% 
  group_by(year) %>% 
  mutate(yrrank = rank(-count, ties.method = "first"))

結果のデータは「年」ごとにグループ化されていることに注意してください。グループ化を削除する場合は、。を使用してパイプを延長できます%>% ungroup()

于 2015-06-01T13:32:20.123 に答える
1

他の人からの回答を使用していると、次の機能が変換およびdyplrのバリアントよりも高速であることがわかりました。

df$year.rank <- ave(count, year, FUN = function(x) rank(-x, ties.method = "first"))
于 2016-04-21T09:19:03.167 に答える