Замените одинаковые значения в последовательных строках и прекратите замену, как только значение изменилось в R - PullRequest
0 голосов
/ 09 июля 2020

Я хочу найти способ заменить последовательные одинаковые значения на 0 в начале каждого испытания, но после изменения значения оно должно прекратить замену и сохранить значение. Это должно происходить при каждом испытании по каждому субъекту.

Например, у первого субъекта есть несколько испытаний (1, 2, и т. Д. c). В начале каждого испытания может быть несколько последовательных строк с одинаковым значением (например, 1, 1, 1). Для этих значений я хотел бы заменить их на 0. Однако, как только значение изменилось с 1 на 0, я хочу сохранить значения в остальной части испытания (например, 0, 0, 1).

subject <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
trial <- c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2)
value <- c(1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1)
df <- data.frame(subject, trial, value)

Таким образом, из исходного фрейма данных я хотел бы иметь новую переменную (value_new), как показано ниже.

   subject trial value value_new
1        1     1     1         0
2        1     1     1         0
3        1     1     1         0
4        1     1     0         0
5        1     1     0         0
6        1     1     1         1
7        1     2     1         0
8        1     2     1         0
9        1     2     0         0
10       1     2     1         1
11       1     2     1         1
12       1     2     1         1

Я думал использовать tidyr и group_by (subject, trial) и изменить новую переменную с помощью условного оператора, но не знаю, как это сделать. Думаю, мне нужно использовать rle (), но, опять же, я понятия не имею, как заменить последовательные значения на 0 и прекратить замену после изменения значения и сохранить остальные значения.

Любые предложения или совет будет очень признателен!

1 Ответ

1 голос
/ 09 июля 2020

Вы можете использовать rleid из data.table:

library(data.table)
setDT(df)[, new_value := value * +(rleid(value) > 1), .(subject, trial)]
df

#    subject trial value new_value
# 1:       1     1     1         0
# 2:       1     1     1         0
# 3:       1     1     1         0
# 4:       1     1     0         0
# 5:       1     1     0         0
# 6:       1     1     1         1
# 7:       1     2     1         0
# 8:       1     2     1         0
# 9:       1     2     0         0
#10:       1     2     1         1
#11:       1     2     1         1
#12:       1     2     1         1

Вы также можете сделать это с помощью dplyr:

library(dplyr)

df %>%
  group_by(subject, trial) %>%
  mutate(new_value = value * +(rleid(value) > 1))
...