Вот пример кода.
df <- structure(list(v1 = c(1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0,
1, 1, 1, 1, 0, 1, 0, 0, 1), v2 = c(1, 0, 1, 1, 0, 1, 0, 1, 0,
1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1), flag = c(NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA)), class = "data.frame", row.names = c(NA, -22L))
Меня интересует кодирование переменной «флаг» таким образом, чтобы при v1 = 0 и следующем v2 = 0 обе строки получали «флаг» в столбце флагов. Если флажок уже установлен, его нельзя изменить (т. е. строка 5 не будет помечена отдельно, но уже отмечена при просмотре строки 4).
Вот желаемый фрейм данных.
df2 <- structure(list(v1 = c(1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0,
1, 1, 1, 1, 0, 1, 0, 0, 1), v2 = c(1, 0, 1, 1, 0, 1, 0, 1, 0,
1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1), flag = structure(c(NA,
NA, NA, 1L, 1L, 1L, 1L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, 1L, 1L, NA), .Label = "flag", class = "factor")), class = "data.frame", row.names = c(NA,
-22L))
Я начал с приведенного ниже кода, который соответствует условиям, которые мне нужны, но изменяет только строку, соответствующую условию v1, а не обе сразу.
df2 <- df %>%
mutate( flag = case_when(v1 == 0 & lead(v2)== 0 ~ 'flag'))
Это очень упрощенная версия моих истинных данных, и я знаю, что есть другие варианты, кроме использования case_when
, но мне бы очень хотелось использовать case_when
. для этого (я также был бы готов использовать ifelse
.
library(tidyverse)
df %>%
mutate(f = v1 == 0 & lead(v2) == 0,
flag = ifelse(f|lag(f), 'flag', NA), f = NULL)
v1 v2 flag
1 1 1 <NA>
2 1 0 <NA>
3 0 1 <NA>
4 0 1 flag
5 0 0 flag
6 0 1 flag
7 1 0 flag
8 1 1 <NA>
9 0 0 <NA>
10 1 1 <NA>
11 0 0 <NA>
12 1 1 <NA>
13 0 0 <NA>
14 1 1 <NA>
15 1 0 <NA>
16 1 0 <NA>
17 1 0 <NA>
18 0 1 <NA>
19 1 1 <NA>
20 0 1 flag
21 0 0 flag
22 1 1 <NA>
Это хорошее решение. Возможно ли это в функции case_when? Я понимаю, что это не обязательно для этого примера.
@ljh2001 зачем тебе case_when
? case_when
полезно, когда у вас более двух категорий. Здесь у нас есть только true/false
. Anyay for case_when
делай flag = case_when(f|lag(f)~'flag')
Это упрощенная версия моих фактических данных. У меня есть case_when
с несколькими аргументами, мне просто нужно было найти решение для этого одного компонента, который меня беспокоил. Благодарю вас!
@akrun Да, это правильно, второй случай не отменяет первоначальный