我遇到了数据集问题。 数据如下所示:
>data
name L1
1 TSS200 1
2 TSS200 1
3 TSS200 1
4 TSS200 1
5 TSS200 2
6 TSS200 3
7 TSS1500 4
8 TSS1500 4
9 TSS1500 4
10 TSS200 4
11 TSS200 5
12 5'UTR 6
13 TSS200 6
我想以越来越多的方式根据L1索引值。例如,对于L1 = 1,有4行,因此索引是1到4;那么对于L1 = 2,只有一行,所以索引是1; L2 = 3,只有一行,索引是1;等等。输出这样的表:
name L1 Index
1 TSS200 1 1
2 TSS200 1 2
3 TSS200 1 3
4 TSS200 1 4
5 TSS200 2 1
6 TSS200 3 1
7 TSS1500 4 1
8 TSS1500 4 2
9 TSS1500 4 3
10 TSS200 4 4
11 TSS200 5 1
12 5'UTR 6 1
13 TSS200 6 2
我希望我已经清楚地说明了这个问题。并提前感谢。
答案 0 :(得分:3)
如果L1总是增加,这将起作用。答案假设您有一个名为d
data.frame(d, Index = unlist(mapply(seq, 1, rle(d$L1)$lengths)))
name L1 Index
1 TSS200 1 1
2 TSS200 1 2
3 TSS200 1 3
4 TSS200 1 4
5 TSS200 2 1
6 TSS200 3 1
7 TSS1500 4 1
8 TSS1500 4 2
9 TSS1500 4 3
10 TSS200 4 4
11 TSS200 5 1
12 5'UTR 6 1
13 TSS200 6 2
答案 1 :(得分:3)
使用dplyr
:
library(dplyr)
data %>%
group_by(L1) %>%
mutate(Index = row_number())
#Source: local data frame [13 x 3]
#Groups: L1
#
# name L1 Index
#1 TSS200 1 1
#2 TSS200 1 2
#3 TSS200 1 3
#4 TSS200 1 4
#5 TSS200 2 1
#6 TSS200 3 1
#7 TSS1500 4 1
#8 TSS1500 4 2
#9 TSS1500 4 3
#10 TSS200 4 4
#11 TSS200 5 1
#12 5'UTR 6 1
#13 TSS200 6 2
答案 2 :(得分:3)
ave
在组内应用函数并返回相等长度的向量,因此seq_along
就是你想要的:
dat$Index <- ave( dat$L1 , dat$L1, FUN=seq_along)
> dat
name L1 Index
1 TSS200 1 1
2 TSS200 1 2
3 TSS200 1 3
4 TSS200 1 4
5 TSS200 2 1
6 TSS200 3 1
7 TSS1500 4 1
8 TSS1500 4 2
9 TSS1500 4 3
10 TSS200 4 4
11 TSS200 5 1
12 5'UTR 6 1
13 TSS200 6 2
答案 3 :(得分:3)
data.table
接近(当然!)
library(data.table)
setDT(data)[, Index := seq_len(.N), by = L1]
name L1 Index
1: TSS200 1 1
2: TSS200 1 2
3: TSS200 1 3
4: TSS200 1 4
5: TSS200 2 1
6: TSS200 3 1
7: TSS1500 4 1
8: TSS1500 4 2
9: TSS1500 4 3
10: TSS200 4 4
11: TSS200 5 1
12: 5'UTR 6 1
13: TSS200 6 2
答案 4 :(得分:1)
有一个方便的sequence
功能。
> data$Index <- sequence(rle(data$L1)$lengths)
或
> data$Index <- sequence(table(data[-1]))
都产生
> data
name L1 Index
1 TSS200 1 1
2 TSS200 1 2
3 TSS200 1 3
4 TSS200 1 4
5 TSS200 2 1
6 TSS200 3 1
7 TSS1500 4 1
8 TSS1500 4 2
9 TSS1500 4 3
10 TSS200 4 4
11 TSS200 5 1
12 5'UTR 6 1
13 TSS200 6 2