根据R中以前出现的情况指定虚拟值
考虑以下数据框架:根据R中以前出现的情况指定虚拟值,r,dataframe,dummy-variable,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
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
如您所见,“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
库(dplyr)
df1%>%
分组人(名称ID)%>%
mutate(dummycount=cummax(滞后(虚拟,默认值=0)))
#一个tibble:13x5
#组:nameID[5]
#名称ID标题年份虚拟dummycount
#
#1 a b 1999 1 0
#2 e c 1999 1 0
#3 i d 2000 0 0
#2000年4月0日
#5 a f 2000 1
#6 e g 2001 0 1
#7 i h 2002 0 0
#8 i j 2003 0 0
α9 U K 2003 2003 1 0
#10 o l 2004 1 0
#上午11时2004分01
#2004年12时01分
#13联合国2005 01
类似地
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>
R>库(dplyr)
R> 种子(1)
R> df%group_by(nameid)%%>%mutate(dc=seq(length(dummy))>min(which(dummy==1),Inf))
#一个tibble:15x3
#组:nameid[5]
nameid虚拟dc
1 a 1错误
2 e 0错误
3 i 0错误
4:0错误
5 u 1错误
6 a 0正确
7 e 0错误
8 i 0错误
9:0错误
10 u 1正确
11 a 1正确
12 e 1错误
13 i 0错误
14:0错误
15 u 0正确
R>
用不朽@akrun的话说,我们需要滞后
library(dplyr)
df1 %>%
group_by(nameID) %>%
mutate(dummycount = cummax(lag(dummy, default = 0)))
这将为以下每次出现的特定“nameID”保留值1。!谢谢@akrun!但是,我还需要它为“nameID”的后续每次出现保留值1,而不仅仅是第一次。假设第14行包含nameID=“a”,那么dummycount=1。@LucasE我认为您需要使用
cummax
进行包装。更新了密码,你就像个该死的忍者。我尊重你。谢谢你,伙计!非常感谢。您是否介意告诉我,这种方法如何成为首选方案?我是这个编码行业的新手,我渴望学习!我不知道这是一个更好的方法。cummax(lag
方法看起来很巧妙。我将其与我想到的其他几种方法进行了对比,结果它赢了,但仅仅是看了看,我很难相信它会比@akrun的解决方案更快。好吧,我想每个人都有自己喜欢的解决问题的方法。不过,感谢您的输入:)