Создать последовательный подсчет в столбце фрейма данных - PullRequest
1 голос
/ 25 ноября 2011

Допустим, у меня есть фрейм данных, похожий на этот:

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 ]

3 голосов
/ 25 ноября 2011

Используйте тот факт, что factor уровни будут увеличивать целые числа:

> x <- c(1, 1, 3, 5, 5, 8)
> as.numeric(factor(x))
[1] 1 1 2 3 3 4
1 голос
/ 25 ноября 2011

Вы можете сделать это с помощью индексации.По сути, вы хотите добавлять по одному при каждом изменении значения в столбце.

Определить данные:

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.

0 голосов
/ 25 ноября 2011

Лично мне нравится решение @ Андри.Но первое, о чем я подумал, это использовать 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 заключается в том, что он не предполагает, что ваш вектор отсортирован, я полагаю, тогда как этот (и @Дирк, я полагаю) оба предполагают, что это было отсортировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...