R 创建一列,根据另一行中的事件为数据帧中的一行赋值

R 创建一列,根据另一行中的事件为数据帧中的一行赋值,r,dplyr,R,Dplyr,我有一个数据帧,其结构如下: example <- data.frame(id = c(1,1,1,1,1,1,1,2,2,2,2,2), event = c("email","email","email","draw","email","email","draw","email",&qu

我有一个数据帧,其结构如下:

example <- data.frame(id = c(1,1,1,1,1,1,1,2,2,2,2,2),
                      event = c("email","email","email","draw","email","email","draw","email","email","email","email","draw"),
                      date = c("2020-03-01","2020-06-01","2020-07-15","2020-07-28","2020-08-07","2020-09-01","2020-09-15","2020-05-22","2020-06-15","2020-07-13","2020-07-15","2020-07-31"),
                      amount = c(NA,NA,NA,10000,NA,NA,1500,NA,NA,NA,NA,2200))
desiredResult <- data.frame(id = c(1,1,1,1,1,1,1,2,2,2,2,2),
                      event = c("email","email","email","draw","email","email","draw","email","email","email","email","draw"),
                      date = c("2020-03-01","2020-06-01","2020-07-15","2020-07-28","2020-08-07","2020-09-01","2020-09-15","2020-05-22","2020-06-15","2020-07-13","2020-07-15","2020-07-31"),
                      amount = c(NA,NA,NA,10000,NA,NA,1500,NA,NA,NA,NA,2200),
                      EmailBeforeDrawFlag = c(NA,NA,1,NA,NA,1,NA,NA,NA,NA,1,NA),
                      EmailBeforeDrawAmount = c(NA,NA,10000,NA,NA,1500,NA,NA,NA,NA,2200,NA))
这是数据帧的简化版本。我正在尝试创建一个列,该列将为提款事件之前的最后一封电子邮件分配1,并创建一个列,该列将在与电子邮件相同的行上提取金额。所需的数据帧如下所示:

example <- data.frame(id = c(1,1,1,1,1,1,1,2,2,2,2,2),
                      event = c("email","email","email","draw","email","email","draw","email","email","email","email","draw"),
                      date = c("2020-03-01","2020-06-01","2020-07-15","2020-07-28","2020-08-07","2020-09-01","2020-09-15","2020-05-22","2020-06-15","2020-07-13","2020-07-15","2020-07-31"),
                      amount = c(NA,NA,NA,10000,NA,NA,1500,NA,NA,NA,NA,2200))
desiredResult <- data.frame(id = c(1,1,1,1,1,1,1,2,2,2,2,2),
                      event = c("email","email","email","draw","email","email","draw","email","email","email","email","draw"),
                      date = c("2020-03-01","2020-06-01","2020-07-15","2020-07-28","2020-08-07","2020-09-01","2020-09-15","2020-05-22","2020-06-15","2020-07-13","2020-07-15","2020-07-31"),
                      amount = c(NA,NA,NA,10000,NA,NA,1500,NA,NA,NA,NA,2200),
                      EmailBeforeDrawFlag = c(NA,NA,1,NA,NA,1,NA,NA,NA,NA,1,NA),
                      EmailBeforeDrawAmount = c(NA,NA,10000,NA,NA,1500,NA,NA,NA,NA,2200,NA))
这是dplyr解决方案。创建新列时,希望在EmailBeforeDrawFlag的定义中使用if_else来检查条件,并使用lead函数在前一行中查找事件。EmailBeforeDrawAmount是juts leadamount

这是dplyr解决方案。创建新列时,希望在EmailBeforeDrawFlag的定义中使用if_else来检查条件,并使用lead函数在前一行中查找事件。EmailBeforeDrawAmount是juts leadamount

我们还可以利用NA^在lead上创建列

-输出

#    id event       date amount EmailBeforeDrawFlag EmailBeforeDrawAmount
#1   1 email 2020-03-01     NA                  NA                    NA
#2   1 email 2020-06-01     NA                  NA                    NA
#3   1 email 2020-07-15     NA                   1                 10000
#4   1  draw 2020-07-28  10000                  NA                    NA
#5   1 email 2020-08-07     NA                  NA                    NA
#6   1 email 2020-09-01     NA                   1                  1500
#7   1  draw 2020-09-15   1500                  NA                    NA
#8   2 email 2020-05-22     NA                  NA                    NA
#9   2 email 2020-06-15     NA                  NA                    NA
#10  2 email 2020-07-13     NA                  NA                    NA
#11  2 email 2020-07-15     NA                   1                  2200
#12  2  draw 2020-07-31   2200                  NA                    NA
我们还可以利用NA^在lead上创建列

-输出

#    id event       date amount EmailBeforeDrawFlag EmailBeforeDrawAmount
#1   1 email 2020-03-01     NA                  NA                    NA
#2   1 email 2020-06-01     NA                  NA                    NA
#3   1 email 2020-07-15     NA                   1                 10000
#4   1  draw 2020-07-28  10000                  NA                    NA
#5   1 email 2020-08-07     NA                  NA                    NA
#6   1 email 2020-09-01     NA                   1                  1500
#7   1  draw 2020-09-15   1500                  NA                    NA
#8   2 email 2020-05-22     NA                  NA                    NA
#9   2 email 2020-06-15     NA                  NA                    NA
#10  2 email 2020-07-13     NA                  NA                    NA
#11  2 email 2020-07-15     NA                   1                  2200
#12  2  draw 2020-07-31   2200                  NA                    NA

我以前从未见过NA的这种行为,其中NA^FALSE=1。这种行为不在NA的文档中。你能给我指出一个来源,让我能读到更多关于它的信息吗?@BenNorris这是一种利用NA^0或NA^1的黑客方式,基本上是假的/真的当然!感谢您指出应该是显而易见的。我以前从未见过NA的这种行为,其中NA^FALSE=1。这种行为不在NA的文档中。你能给我指出一个来源,让我能读到更多关于它的信息吗?@BenNorris这是一种利用NA^0或NA^1的黑客方式,基本上是假的/真的当然!感谢您指出本应显而易见的内容。