为数据框中的因子添加重复索引

时间:2011-05-27 10:28:26

标签: r dataframe

我有一个数据框,我想在其中添加索引,例如1 ... n表示数据框中的每个因子。这是一个带有一些虚拟数据的例子。

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

我想添加一个额外的列,分别为每个因子添加索引1到n。恢复数据框架如下:

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

任何人都可以解释如何这样做吗?提前谢谢。

4 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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))))