Присвоение фиктивных значений на основе предыдущих вхождений в R - PullRequest
0 голосов
/ 18 сентября 2018

Рассмотрим приведенный ниже фрейм данных:

   nameID titleID year dummy
1       a       b 1999     1
2       e       c 1999     1
3       i       d 2000     0
4       o       f 2000     0
5       a       f 2000     1
6       e       g 2001     0
7       i       h 2002     0
8       i       j 2003     0
9       u       k 2003     1
10      o       l 2004     1
11      a       m 2004     0
12      o       m 2004     0
13      u       n 2005     0

Мне нужен скрипт, который добавит новый столбец «dummycount» и присвоит ему значение 0 или 1, в зависимости от следующих условий:

  • 0 = Для данного "nameID", в столбце "dummy" нет предыдущего вхождения 1
  • 1 = Для данного "nameID", по крайней мере, в одном вхождении 1 встолбец "dummy".

Вот пример желаемого вывода, который я собрал:

   nameID titleID year dummy dummycount
1       a       b 1999     1          0
2       e       c 1999     1          0
3       i       d 2000     0          0
4       o       f 2000     0          0
5       a       f 2000     1          1
6       e       g 2001     0          1
7       i       h 2002     0          0
8       i       j 2003     0          0
9       u       k 2003     1          0
10      o       l 2004     1          0
11      a       m 2004     0          1
12      o       m 2004     0          1
13      u       n 2005     0          1

Как видите, "dummycounts" принимает только значение 1,если у «nameID» есть хотя бы одно предыдущее единственное вхождение 1 в столбце «dummy».

Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Аналогично.

R> library(dplyr)
R> set.seed(1)
R> df <- data.frame(nameid=rep(c('a','e','i','o','u'),3), dummy=0+(runif(15)<0.3))

R> df %>% group_by(nameid) %>% mutate(dc=seq(length(dummy)) > min(which(dummy==1), Inf))
# A tibble: 15 x 3
# Groups:   nameid [5]
   nameid dummy dc   
   <fct>  <dbl> <lgl>
 1 a          1 FALSE
 2 e          0 FALSE
 3 i          0 FALSE
 4 o          0 FALSE
 5 u          1 FALSE
 6 a          0 TRUE 
 7 e          0 FALSE
 8 i          0 FALSE
 9 o          0 FALSE
10 u          1 TRUE 
11 a          1 TRUE 
12 e          1 FALSE
13 i          0 FALSE
14 o          0 FALSE
15 u          0 TRUE 
R> 
0 голосов
/ 18 сентября 2018

По словам бессмертного @akrun, нам нужно lag.

library(dplyr)
df1 %>% 
  group_by(nameID) %>%
  mutate(dummycount =  cummax(lag(dummy, default = 0)))

Это сохранит значение 1 для каждого последующего вхождения конкретного "nameID".

0 голосов
/ 18 сентября 2018

Нам нужно lag

library(dplyr)
df1 %>% 
  group_by(nameID) %>%
  mutate(dummycount =  cummax(lag(dummy, default = 0)))
# A tibble: 13 x 5
# Groups:   nameID [5]
#   nameID titleID  year dummy dummycount
#   <chr>  <chr>   <int> <int>      <int>
# 1 a      b        1999     1          0
# 2 e      c        1999     1          0
# 3 i      d        2000     0          0
# 4 o      f        2000     0          0
# 5 a      f        2000     1          1
# 6 e      g        2001     0          1
# 7 i      h        2002     0          0
# 8 i      j        2003     0          0
# 9 u      k        2003     1          0
#10 o      l        2004     1          0
#11 a      m        2004     0          1
#12 o      m        2004     0          1
#13 u      n        2005     0          1
...