Вы можете использовать lag()
из dplyr:
library(dplyr)
sum(v == "C" & lag(v) == "F", na.rm = TRUE)
(na.rm = TRUE
потому, что первое значение lag(v)
- NA).
Ваш комментарий отмечает, что вы также заинтересованы в применении этого к каждой строке фрейма данных. Это можно сделать, повернув данные, чтобы они были длиннее, затем применив сгруппированное изменение, а затем снова повернув данные, чтобы они были шире. В примере набора данных:
example <- tibble(id = 1:3,
s1 = c("F", "F", "F"),
s2 = c("C", "F", "C"),
s3 = c("C", "C", "F"),
s4 = c("F", "C", "C"))
example %>%
pivot_longer(s1:s4) %>%
group_by(id) %>%
mutate(fc_count = sum(value == "C" & lag(value) == "F", na.rm = TRUE)) %>%
ungroup() %>%
pivot_wider(names_from = name, values_from = value)
Результат:
# A tibble: 3 x 6
id fc_count s1 s2 s3 s4
<int> <int> <chr> <chr> <chr> <chr>
1 1 1 F C C F
2 2 1 F F C C
3 3 2 F C F C
Обратите внимание, что это предполагало, что данные имели что-то вроде столбца id
, который однозначно идентифицирует каждую исходную строку. Если это не так, вы можете сначала добавить его с mutate(id = row_number())
.