根据之前在 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:
- 0 = 对于给定的 "nameID",之前没有在列 "dummy"
中出现 1
- 1 = 对于给定的 "nameID",列 "dummy".
中至少出现一次 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。
考虑下面的数据框:
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",列 "dummy". 中至少出现一次 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。