考虑下面的数据框:
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
如您所见,“dummycounts”仅取值1,如果“nameID”在“dummy”列中至少有一个先前的单次出现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。