2011-05-27 42 views
2

我有一個數據框,我想在其中添加索引,例如1 ... n在我的數據框中的每個因素。這裏有一些虛擬數據的例子。爲數據幀中的因子添加重複索引

factor 
a   
a   
a   
a   
a   
b   
b   
b   
b   
b 
c 
c 
c 
c 

我想添加一個額外的列,分別爲每個因素添加索引1到n。 resulant數據幀看起來像:

factor index 
a  1 
a  2 
a  3 
a  4 
a  5 
b  1 
b  2 
b  3 
b  4 
b  5 
c  1 
c  2 
c  3 
c  4 

任何人都可以解釋如何做到這一點?提前致謝。

回答

3

一種方法是:

unlist(lapply(split(x, x), seq_along)) 

其中x是作爲載體的因素。

R> x <- factor(rep(letters[1:3], times = c(5,5,4))) ## your data 
R> data.frame(factor = x, index = unlist(lapply(split(x, x), seq_along), 
+    use.names = FALSE)) 
    factor index 
1  a  1 
2  a  2 
3  a  3 
4  a  4 
5  a  5 
6  b  1 
7  b  2 
8  b  3 
9  b  4 
10  b  5 
11  c  1 
12  c  2 
13  c  3 
14  c  4 

的另一種方式,在相似的主題是使用table()seq_len()

unlist(sapply(table(x), seq_len), use.names = FALSE) 

而另一種方式是使用經由rle()的遊程長度編碼:

R> rle(as.character(x))$lengths 
[1] 5 5 4 

其我們可以插入代碼sapply()而不是table()

R> unlist(sapply(rle(as.character(x))$lengths, seq_len), use.names = FALSE) 
[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 
+0

如果'x'混合此方法將失敗。試試'x <-sample(x)'並運行你的代碼。 – Marek 2011-05-27 11:06:22

+0

@Marek鑑於OP顯示了排序數據,我認爲我提供的答案沒有任何問題。或者我們應該再次猜測OP現在真正想要的是什麼? ;-)無論如何,'x < - sort(sample(x))'將解決問題:-) – 2011-05-27 11:18:40

+0

同意這兩個:) – Marek 2011-05-27 11:24:00

14

您可以使用ave功能:

your_data <- data.frame(
    factor=factor(rep(letters[1:3], times = c(5,5,4))) 
) 
your_data$index <- ave(rep(NA, nrow(your_data)), your_data$factor, FUN=seq_along) 
+1

+1在這裏很好的使用'ave()',*和*它在數據未排序時有效。 – 2011-05-27 11:27:36

1

請嘗試以下功能:

facSeq <- function(x){ 
    x.l <-length(x) 
    x.f.l <- length(levels(x)) 
    sapply(1:x.f.l,function(y) cumsum(as.integer(x)%in%y))[1:x.l+x.l*(as.integer(x)-1)] 
} 

測試:

fac1 <- factor(rep(letters[1:3],each=5)) 

> data.frame(fac1,index=facSeq(fac1)) 
    fac1 index 
1  a  1 
2  a  2 
3  a  3 
4  a  4 
5  a  5 
6  b  1 
7  b  2 
8  b  3 
9  b  4 
10 b  5 
11 c  1 
12 c  2 
13 c  3 
14 c  4 
15 c  5 

更有意思的例子:

fac2 <- factor(sample(letters[1:5],20,replace=T)) 

> data.frame(fac2,index=facSeq(fac2)) 
    fac2 index 
1  a  1 
2  a  2 
3  d  1 
4  b  1 
5  a  3 
6  e  1 
7  e  2 
8  a  4 
9  c  1 
10 e  3 
11 b  2 
12 d  2 
13 b  3 
14 e  4 
15 e  5 
16 d  3 
17 c  2 
18 e  6 
19 b  4 
20 d  4 
0

在使用sequencetable基R:

df$index <- sequence(table(df$factor)) 

    # factor index 
# 1  a  1 
# 2  a  2 
# 3  a  3 
# 4  a  4 
# 5  a  5 
# 6  b  1 
# 7  b  2 
# 8  b  3 
# 9  b  4 
# 10  b  5 
# 11  c  1 
# 12  c  2 
# 13  c  3 
# 14  c  4 

數據

df <- data.frame(factor=factor(rep(letters[1:3], times = c(5,5,4))))