在R中按名称索引表

在R中按名称索引表,r,indexing,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 name L1 Index 1 TS

我的数据集有问题。 数据如下所示:

>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
      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
我想根据L1,以递增的方式对值进行索引。例如,对于L1=1,有4行,因此索引为1到4;那么对于L1=2,只有一行,所以索引是1;L2=3,只有一行,索引为1;等等输出如下表:

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

我希望我已清楚说明问题。提前感谢。

如果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

使用
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

ave
在组内应用函数并返回等长向量,因此
seq_沿途
就是您想要的:

  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
dat$索引dat
名称L1索引
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
11 TSS200 5 1
12 5'UTR 6 1
13 TSS200 6 2

数据表
方法(当然!)


有一个方便的
序列
功能

> data$Index <- sequence(rle(data$L1)$lengths)

你能澄清一下是什么决定了指数的价值吗?“我不明白基本原理。”斯普伦格迈斯特我对我的帖子做了一些改动。谢谢谢谢你,现在更清楚了。最经典的方法是
?ave
ave(DF$L1,DF$L1,FUN=seq_-along)
mapply对我来说太低级了。我永远不会明白这一点function@Vlo这里我多次调用
seq
,每次我都想提供1作为
from
参数,并依次提供
rle(d$L1)$length
中的每个值作为
to
参数。这基本上与sapply(rle(d$L1)$length,function(x)seq(1,x))的想法相同,这是一个很好的解释。有没有一个原因可以解释为什么FUN是第一个参数,而不是base R中的大多数其他*apply族函数。将
mapply
想象成与
do.call类似的函数,这是有意义的。
> 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