基于可变长度行添加索引列

时间:2013-12-28 02:23:57

标签: r indexing subset

这可能是一个简单的问题,但我找不到答案。我的问题是如何根据变量行长度添加索引列。例如,在下面的数据框中,我试图添加第3列,其中每次切换序列时索引号都会增加。样本序列6:29 = Setnum 1,34:50 = Setnum 2,56:79 = Setnum 3,84:100 = Setnum 4等。

Sample <- rep(c(6:29, 34:50, 56:79, 84:100, 106:129, 134:150), each=1, times=8)
set.seed(123)
randdf <- data.frame(area = round(rnorm(984, mean = 1000000, sd = 100000)), Sample)

我希望最终得到的是每个样本序列的运行计数,直到数据帧结束,无论样本序列集的数量是多少。

Sample   Setnum  area
6        1       
7        1       
...      1
29       1
34       2
35       2
...      2
50       2
...      3...5
134      6
135      6
...      6
150      6
6        7
7        7
...
134      8
135      8

每个样品序列的起始编号和结束编号相同。但是由于缺少数据,每个样本序列中的观察数量不尽相同。

我想我需要在每个Sample序列(6,34,56,84等)的开头使用'split'然后'cumsum'?以下代码的效果:

cumsum(randdf[,1]=="6" | "34" | "56" | "84" | etc)
IndexDF <- split(randdf, cumsum(randf[,1]=="6"| etc))
## Setnum is the name of the index column
for(i in 1:length(IndexDF)) {IndexDF[[i]] <-cbind(IndexDF[[i]], 
Setnum=rep(i, nrow(IndexDF[[i]])))}

我希望我的问题很明确。谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

基于@agstudy的答案,你需要这样做:

randdf$Setnum  = cumsum(c(1,diff(randdf$Sample)!=1))

仅当样本量之间存在跳跃时才会起作用,因此更改组时差异不是1。

答案 1 :(得分:0)

例如:

cumsum(c(1,diff(sample)!=1)+1