我有一个数据框,我想在其中添加索引,例如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
任何人都可以解释如何这样做吗?提前谢谢。
答案 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)
在使用sequence
和table
的基地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))))