1

我有一个如下所示的 data.frame:

df <- data.frame(names=c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"), 
                 values=c(1,1,4,6,7,7,7,9,9,14,15))

我想要类似的东西:

df <- data.frame(names=c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"), 
                 values=c(1,1,2,3,4,4,4,5,5,6,7))

我知道这是一个愚蠢的问题,但我不知道该怎么做。谢谢

注意:第二个 data.frame 中的值应该是从 1 到 n 的顺序

4

3 回答 3

7

您可以使用cumsum

df <- transform(df, values = cumsum(c(1, head(values, -1) != tail(values, -1))))

另一个版本可能更容易理解,但我猜会慢一点:

df<- transform(df, values = cumsum(c(1, diff(values) != 0))
于 2013-07-29T16:58:39.980 回答
4

假设df$values已排序,另一种方法是使用table.

tt <- table(df$values)
rep(seq_along(tt), tt)
# [1] 1 1 2 3 4 4 4 5 5 6 7
于 2013-07-29T17:12:43.217 回答
1

另一种选择是转换为因子并从那里提取排序:

df$values = as.numeric(as.factor(df$values))
于 2013-07-29T18:26:59.767 回答