在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