2013-07-29 4 views
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 до п

ответ

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

+1 действительно крутой способ сделать эту задачу! – Arun

+0

@flodel, вторая версия мне легче понять, спасибо !!! – user2380782

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 
+0

большое спасибо, ваш подход работает очень хорошо, а – user2380782

1

Другой вариант заключается в преобразовании фактор и извлечь упорядоченность оттуда:

df$values = as.numeric(as.factor(df$values)) 
Смежные вопросы