根据之前在 R 中出现的情况分配虚拟值

Assigning dummy values based on previous occurrences in R

考虑下面的数据框:

   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:

这是我放在一起的所需输出示例:

   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

如您所见,如果 "nameID" 在 "dummy" 列中至少出现过一次 1,则 "dummycounts" 仅取值 1。

感谢您的帮助!

我们需要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

同理。

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> 

用不朽的@akrun的话来说,我们需要lag.

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

这将在每次出现特定 "nameID" 时保持值 1。