我有一个名为' batsmen'的数据框架。它有近10万行。
一栏称为' Inns'。它像{1,1,1,1,2,2,2,1,1,1,1,1,2,2,2,2,0,0,1,1,1,1,1 ,2,2,2,2,2,2,2 ...}
我想定义一个新列' Position'在相同的数据框架中。它将是一个条件整数序列(seq.int)。它将从1开始,继续直到' Inns'改变价值。一旦'旅馆'改变价值,'位置'将从1开始。因此,在上面的例子中,' Inns' Position' Position'应该是这样的: {1,2,3,4,1,2,3,1,2,3,4,5,1,2,3,4,1,2,1,2,3,4,5,1,2 ,3,4,5,6,7 ....}
我可以使用for循环来做到这一点。但是我不希望在运行时丢失,因为我认为这是整个计划中的一小步。你能否在不使用for循环的情况下提出一个简单的方法?
答案 0 :(得分:2)
您可以使用data.table::rleid
为每个连续相等的值创建一个id,并将其用作组变量来生成序列:
x <- c(1,1,1,1,2,2,2,1,1,1,1,1,2,2,2,2,0,0,1,1,1,1,1,2,2,2,2,2,2,2)
ave(x, data.table::rleid(x), FUN = seq_along)
# [1] 1 2 3 4 1 2 3 1 2 3 4 5 1 2 3 4 1 2 1 2 3 4 5 1 2 3 4 5 6 7
或者您可以使用baseR diff
和cumsum
来创建组变量:
ave(x, cumsum(c(F, diff(x) != 0)), FUN = seq_along)
# [1] 1 2 3 4 1 2 3 1 2 3 4 5 1 2 3 4 1 2 1 2 3 4 5 1 2 3 4 5 6 7
答案 1 :(得分:1)
我们可以使用基础R rle
函数,然后提取它的length
属性并使用sequence
函数生成适当的序列
sequence(rle(x)$lengths)
#[1] 1 2 3 4 1 2 3 1 2 3 4 5 1 2 3 4 1 2 1 2 3 4 5 1 2 3 4 5 6 7