我有一个看起来像这样的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的顺序
答案 0 :(得分: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))
答案 1 :(得分: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
答案 2 :(得分:1)
另一种选择是转换为因子并从那里提取排序:
df$values = as.numeric(as.factor(df$values))