我们假设我的数据框看起来像这样:
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
如果有一些方法可以简单地用其他东西替换数据框中的元素,这可以很容易地完成。但是,我不知道是否有这样的命令。另外,我猜某种宏观命令可以做这样的事情,但我猜不会有这样的命令。
答案 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)都认为它已被排序。