Увеличение на 1 для каждого изменения в столбце

Допустим, у меня есть следующий фрейм данных

set.seed(123) df 0.5)*1) 

var1 может иметь любой тип / количество уровней, а не только 0 и 1s

Я хотел бы создать var2 который увеличивается на 1 каждый раз, когда var1 изменяется без использования for loop

Ожидаемый результат в этом случае:

 data.frame(var1=(runif(10)>0.5)*1, var2=c(1, 2, 3, 4, 4, 5, 6, 6, 6, 7)) var1 var2 0 1 1 2 0 3 1 4 1 4 0 5 1 6 1 6 1 6 0 7 

Другим вариантом для фрейма данных может быть:

 df <- data.frame(var1=c("a", "a", "1", "0", "b", "b", "b", "c", "1", "1")) 

в этом случае результат должен быть:

 var1 var2 a 1 a 1 1 2 0 3 b 4 b 4 b 4 c 5 1 6 1 6 

Основываясь на мистере Флик, ответьте:

 df$var2 <- cumsum(c(0,as.numeric(diff(df$var1))!=0)) 

Но если вы не хотите использовать diff вы все равно можете использовать:

 df$var2 <- c(0,cumsum(as.numeric(with(df,var1[1:(length(var1)-1)] != var1[2:length(var1)])))) 

Он начинается с 0, а не с 1, но я уверен, что вы видите, как изменить его, если хотите.

Как насчет использования diff() и cumsum() . Например

 df$var2 <- cumsum(c(1,diff(df$var1)!=0)) 

Они выглядят как кодирование длины строки (rle)

 x = c("a", "a", "1", "0", "b", "b", "b", "c", "1", "1") r = rle(x) 

с

 > rle(x) Run Length Encoding lengths: int [1:6] 2 1 1 3 1 2 values : chr [1:6] "a" "1" "0" "b" "c" "1" 

Это говорит о том, что первое значение («a») произошло 2 раза подряд, затем «1» произошло один раз и т. Д. То, что вам нужно, – это создать последовательность вдоль «длины» и реплицировать каждый элемент последовательности на количество раз, когда элемент происходит, поэтому

 > rep(seq_along(r$lengths), r$lengths) [1] 1 1 2 3 4 4 4 5 6 6 

Другие ответы являются полуобязательными, поскольку они полагаются на столбец, являющийся фактором (); они терпят неудачу, когда столбец фактически является символом ().

 > diff(x) Error in r[i1] - r[-length(r):-(length(r) - lag + 1L)] : non-numeric argument to binary operator 

Обходной способ состоял в том, чтобы сопоставить символы с целыми числами вдоль линий

 > diff(match(x, x)) [1] 0 2 1 1 0 0 3 -5 0 

Хм, но, сказав, что я нахожу, что rle не работают на факторы!

 > f = factor(x) > rle(f) Error in rle(factor(x)) : 'x' must be a vector of an atomic type > rle(as.vector(f)) Run Length Encoding lengths: int [1:6] 2 1 1 3 1 2 values : chr [1:6] "a" "1" "0" "b" "c" "1" 

Вот еще одно решение с базой R с использованием inverse.rle() :

 df <- data.frame(var1=c("a", "a", "1", "0", "b", "b", "b", "c", "1", "1")) r <- rle(as.character(df$var1)) r$values <- seq_along(r$values) df$var2 <- inverse.rle(r) 

Укороченная версия:

 df$var2 <- with(rle(as.character(df$var1)), rep(seq_along(values), lengths)) 

Вот решение с data.table :

 library("data.table") dt <- data.table(var1=c("a", "a", "1", "0", "b", "b", "b", "c", "1", "1")) dt[, var2:=rleid(var1)] 
  • индекс возврата из вектора значения, ближайшего к данному элементу
  • Проверить наличие директории и создать, если не существует
  • Какая польза от этого?
  • Вычисление суммарной суммы для каждой строки
  • Возвращаемый индекс наименьшего значения в векторе?
  • Вычислить разницу между значениями в последовательных строках по группам
  • Удалите все знаки препинания, кроме апострофов в R
  • Свернуть текст по группе в кадре данных
  • Манекены переменных из строковой переменной
  • R: t-тест по всем столбцам
  • Разверните строки по дате с использованием даты начала и окончания
  • Interesting Posts

    JPA CascadeType.ALL не удаляет сирот

    Tmux замедляет процесс прерывания с помощью Ctrl-C

    Единичный тест на безопасность резьбы?

    Как я могу запустить проект с несколькими файлами в основном пакете?

    Как распаковать и упаковать файл pkg?

    Ошибка сегментации компилятора Swift при построении

    Двойная SIM-карта Android

    Ячейки не обновляются автоматически

    Можно ли использовать регулярные выражения для соответствия вложенным шаблонам?

    Как добавить проект библиотеки в Android Studio?

    В Firebase существует ли способ получить число дочерних узлов узла без загрузки всех данных узла?

    Пример кода Resharper для объяснения «Возможное множественное перечисление IEnumerable»

    Google Hangouts заблокирован и не доступен для входа.

    Какое программное обеспечение доступа (экранные программы) предназначено для окон?

    Как передать данные от 2-го действия до 1-го действия при нажатии? – Андроид

    Давайте будем гением компьютера.