последнее вхождение определенного значения с оператором if else по группе - PullRequest
1 голос
/ 26 сентября 2019

Допустим, у меня есть следующие данные:

library(tidyverse)
cf <- data.frame(x = c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c", "c", "c", "d", "d", "e", "e"), 
            y = c("free", "with", "sus", "sus", "free", "with", "free", "sus", "sus", "with", "free", "sus", "free", "free", "with", "sus"))
> cf
   x    y
1  a free
2  a with
3  a  sus
4  a  sus
5  b free
6  b with
7  b free
8  b  sus
9  c  sus
10 c with
11 c free
12 c  sus
13 d free
14 d free
15 e with
16 e  sus

Я хочу получить индикаторную переменную, равную 1, если последнее значение y по группам равно sus, а последнее значениераньше sus было with.Может быть несколько sus, прежде чем with произойдет, как в группе a.Если free происходит последним первым перед with, то его ноль.

Желаемый вывод:

   x    y sus_with
1  a free        0
2  a with        0
3  a  sus        0
4  a  sus        1
5  b free        0
6  b with        0
7  b free        0
8  b  sus        0
9  c  sus        0
10 c with        0
11 c free        0
12 c  sus        0
13 d free        0
14 d free        0
15 e with        0
16 e  sus        1 

Я думал что-то вроде этого:

cf %>%
  group_by(x) %>%
  mutate(sus_with = if_else(row_number() == n() & y == "sus" & last(y == "with" & y != "free"), 1, 0))

refs:

Как найти датупосле последнего вхождения определенного наблюдения в R?

Как найти последнее вхождение определенного наблюдения в сгруппированных данных в R?

любые предложенияпожалуйста

1 Ответ

3 голосов
/ 26 сентября 2019

Мы можем group_by x и проверить, является ли last значение y равным "sus", а значение last, которое не является "sus", равно "with", и присвоить значение 1 для последней строкигруппы.

library(dplyr)

cf %>%
  group_by(x) %>%
  mutate(sus_with = as.integer(last(y) == 'sus' & last(y[y != "sus"]) == 'with' 
                     & row_number() == n()))

#    x     y     sus_with
#   <fct> <fct>    <int>
# 1 a     free         0
# 2 a     with         0
# 3 a     sus          0
# 4 a     sus          1
# 5 b     free         0
# 6 b     with         0
# 7 b     free         0
# 8 b     sus          0
# 9 c     sus          0
#10 c     with         0
#11 c     free         0
#12 c     sus          0
#13 d     free         0
#14 d     free         0
#15 e     with         0
#16 e     sus          1
...