在数据框列中创建顺序计数

时间:2011-11-25 17:36:51

标签: r

我们假设我的数据框看起来像这样:

Value1   Value2
1        543
1        845
3        435
5        724
5        234
8        204

现在,我希望第一列按顺序计数,而不是每次值更改时跳过几个步骤,如下所示:

Value1   Value2
1        543
1        845
2        435
3        724
3        234
4        204

如果有一些方法可以简单地用其他东西替换数据框中的元素,这可以很容易地完成。但是,我不知道是否有这样的命令。另外,我猜某种宏观命令可以做这样的事情,但我猜不会有这样的命令。

3 个答案:

答案 0 :(得分:3)

利用factor级别增加整数的事实:

> x <- c(1, 1, 3, 5, 5, 8)
> as.numeric(factor(x))
[1] 1 1 2 3 3 4

答案 1 :(得分:1)

您可以使用索引来完成此操作。实质上,您希望每次列中的值更改时添加一个。

定义数据:

R> z <- c(1,1,3,5,5,8)

所有但是最后和所有但首先:

R> head(z,-1)
[1] 1 1 3 5 5
R> z[-1] 
[1] 1 3 5 5 8

比较,反转比较,然后对布尔值求和:

R> z[-1] == head(z,-1)
[1]  TRUE FALSE FALSE  TRUE FALSE
R> z[-1] != head(z,-1)
[1] FALSE  TRUE  TRUE FALSE  TRUE
R> cumsum(z[-1] != head(z,-1))
[1] 0 1 2 2 3
R> 

然后在我们添加1的地方使用它来弥补最初的成对比较:

R> cumsum(c(1, z[-1] != head(z,-1)))
[1] 1 1 2 3 3 4

因此,您可以使用此类表达式替换data.frame中的值。

答案 2 :(得分:0)

就个人而言,我有点像@Andrie的解决方案。但我想到的第一件事是使用rle

x <- c(1,1,3,5,5,8)
r <- rle(x)

> rep(seq_len(length(r$lengths)),times = r$lengths)
[1] 1 1 2 3 3 4

关于@Andrie解决方案的一个好处是它不会假设你的矢量是排序的,我相信,而这(和我认为的@Dirk)都认为它已被排序。