这可能是一个简单的问题,但我找不到答案。我的问题是如何根据变量行长度添加索引列。例如,在下面的数据框中,我试图添加第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]])))}
我希望我的问题很明确。谢谢你的帮助。
答案 0 :(得分:2)
基于@agstudy的答案,你需要这样做:
randdf$Setnum = cumsum(c(1,diff(randdf$Sample)!=1))
仅当样本量之间存在跳跃时才会起作用,因此更改组时差异不是1。
答案 1 :(得分:0)
例如:
cumsum(c(1,diff(sample)!=1)+1