Операции по строкам во фрейме данных, где каждая строка зависит от предыдущей строки в R

#r #tidyverse #rowwise

Вопрос:

Я хотел бы найти комбинацию некоторого значения в кадре данных из одного столбца и некоторой строки со значением из того же столбца и предыдущей строки. Вот воспроизводимый пример.

У меня есть четыре возможных условия, и я хочу определить пары (двух) последовательных строк.

 library(tidyverse) library(purrr)  df lt;- data.frame(  condition = sample(  x = c("IL", "IR", "EL", "ER"), size = 10, replace = TRUE  )  )  df   condition 1 IR 2 EL 3 IR 4 EL 5 ER 6 IL 7 IR 8 EL 9 EL 10 EL  

Другими словами, я хотел бы получить колонку «пара», такую как:

 condition pair 1 IR NA 2 EL IR-EL 3 IR EL-IR 4 EL IR-EL 5 ER EL-ER 6 IL ER-IL 7 IR IL-IR 8 EL IR-EL 9 EL EL-EL 10 EL EL-EL  

Я пробовал использовать purrr::accumulate() в сочетании с paste (), но он накапливает все предыдущие значения. Как я могу сохранить только предыдущие и текущие значения (т. Е. отставание 1)?

 df %gt;%  mutate(  pair = accumulate(  .x = condition,  .f = ~paste(.x, .y, sep = "-")  )  )   condition pair 1 IL IL 2 ER IL-ER 3 IL IL-ER-IL 4 IL IL-ER-IL-IL 5 EL IL-ER-IL-IL-EL 6 EL IL-ER-IL-IL-EL-EL 7 IL IL-ER-IL-IL-EL-EL-IL 8 IL IL-ER-IL-IL-EL-EL-IL-IL 9 IL IL-ER-IL-IL-EL-EL-IL-IL-IL 10 IR IL-ER-IL-IL-EL-EL-IL-IL-IL-IR  

Я хочу сохранить только пары из двух последовательных испытаний. Есть идеи? NB: Я бы предпочел вариант tidyverse.

Ответ №1:

Воспользуйся lag .

 df %gt;%   mutate(pair = paste(lag(condition),condition,sep="-"))   condition pair 1 ER NA-ER 2 EL ER-EL 3 IR EL-IR 4 ER IR-ER 5 ER ER-ER 6 IR ER-IR 7 IR IR-IR 8 IR IR-IR 9 IR IR-IR 10 EL IR-EL