R中的名称索引表

时间:2014-07-31 20:00:00

标签: r indexing

我遇到了数据集问题。 数据如下所示:

>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

我希望我已经清楚地说明了这个问题。并提前感谢。

5 个答案:

答案 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