根据R

时间:2018-09-18 17:02:49

标签: r dataframe dummy-variable

请考虑以下数据框:

   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”,在“虚拟”列中以前没有出现过1。
  • 1 =对于给定的“ nameID”,在“虚拟”列中至少出现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”在“虚拟”列中至少有一个以前的单次出现1,则“ dummycounts”仅取值1。

谢谢您的帮助!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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> 

答案 2 :(得分:1)

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

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

对于以后每次出现的特定“ nameID”,该值都将保持为1。