r - 在组上创建对的滚动索引

标签 r

我需要(使用 R)从包含组的数据集中创建对的滚动索引。考虑以下数据集:

times <- c(4,3,2)
V1 <- unlist(lapply(times, function(x) seq(1, x)))
df <- data.frame(group = rep(1:length(times), times = times), 
                 V1 = V1, 
                 rolling_index = c(1,1,2,2,3,3,4,5,5))

df
  group V1 rolling_index
1     1  1             1
2     1  2             1
3     1  3             2
4     1  4             2
5     2  1             3
6     2  2             3
7     2  3             4
8     3  1             5
9     3  2             5

我拥有的数据框包括变量组和 V1。在每个组中,V1 指定一个运行索引(可能从 1 开始,也可能不从 1 开始)。

我想创建一个看起来像 rolling_index 的新索引变量。此变量将同一组内的行和连续的 V1 值分组,从而创建一个新的滚动索引。这个新索引必须在组上是连续的。如果组内的行数不均匀(例如组 2),则最后一个单行将获得其自己的滚动索引值。

最佳答案

你可以试试

library(data.table)
setDT(df)[,  gr:=as.numeric(gl(.N, 2, .N)), group][, 
     rollindex:=cumsum(c(TRUE,abs(diff(gr))>0))][,gr:= NULL]
#    group V1 rolling_index rollindex
#1:     1  1             1         1
#2:     1  2             1         1
#3:     1  3             2         2
#4:     1  4             2         2
#5:     2  1             3         3
#6:     2  2             3         3
#7:     2  3             4         4
#8:     3  1             5         5
#9:     3  2             5         5

或者使用 base R

 indx1 <- !duplicated(df$group)
 indx2 <- with(df, ave(group, group, FUN=function(x)
                           gl(length(x), 2, length(x))))
 cumsum(c(TRUE,diff(indx2)>0)|indx1)
 #[1] 1 1 2 2 3 3 4 5 5

更新

以上方法均基于“组”列。假设您已经有一个按组的序列列('V1'),如示例所示,创建滚动索引更容易

 cumsum(!!df$V1 %%2)
 #[1] 1 1 2 2 3 3 4 5 5

如帖子中所述,如果某些组的'V1'列不是从'1'开始,我们可以从'group'中获取序列,然后像上面一样执行cumsum

 cumsum(!!with(df, ave(seq_along(group), group, FUN=seq_along))%%2)
 #[1] 1 1 2 2 3 3 4 5 5

关于r - 在组上创建对的滚动索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30167007/

相关文章:

r - 根据R中的属性表值导出栅格

r - 如何正确发起 POST 请求

r - 如何将函数应用于 r 中的列子集?

r - 更改构面标签文本和背景颜色

r - 提高数据表日期+时间粘贴的性能?

r - 在没有 for 循环的情况下填充 R 中的函数评估矩阵

r - 条件单元格的 cell_spec

regex - 如何使用基于正则表达式的列表中的值将列添加到 data.table

r - R中的knitr安装,错误

html - 如何在 rmarkdown 上使用 HTML <kbd> 标签?