2017-04-25 52 views
0

我有以下代碼[R排序方法

> x <- c("A", "B", "A", "C", "B", "A", "D") 
> df <- data.frame(x) 
> df 
    x 
1 A 
2 B 
3 A 
4 C 
5 B 
6 A 
7 D 
> 

我最終想要打上新的列中的數據幀行,以便x的每個實例都標有它的排名像這樣

1 A 1 
2 B 1 
3 A 2 
4 C 1 
5 B 2 
6 A 3 
7 D 1 

這是我一直在想的方式,但我不確定這是否是最好的方式

> df$y <- sapply(df$x, function(x){order(which(df$x==x))}); 
> df 
    x  y 
1 A 1, 2, 3 
2 B 1, 2 
3 A 1, 2, 3 
4 C  1 
5 B 1, 2 
6 A 1, 2, 3 
7 D  

所以,基本上,我現在以順序方式將每個'x'與索引一起構成一個數據框。

如何在不編寫顯式循環的情況下從此處繼續?有更好的方法嗎?

回答

1

使用data.table方法:

require(data.table) 
x <- c("A", "B", "A", "C", "B", "A", "D") 
dt <- data.table(x) 
dt[,RANK := seq_len(.N), by = x] 
+0

這工作。但是,我是R新手,沒有遇到過seq_len(.N)。你能指點我的相關文件嗎? – user3701522

+0

它非常簡單seq_len(x)爲您提供從1到x的序列,.N是數據表語法並計算行數 –