R选择在特定日期之前发生的数据

时间:2015-07-14 19:34:45

标签: r

所以我有两个看起来像这样的数据集(表):

数据集A:

Email   Date    Action
aaaa    1/5/14  won
bbbb    2/10/14 won
cccc    1/14/14 won
dddd    3/3/14  won
eeee    4/19/14 won

数据集B:

Email   Date    Action
aaaa    1/5/14  won
aaaa    1/6/14  call
aaaa    1/9/14  email
aaaa    1/20/14 email
bbbb    2/8/14  email
bbbb    2/9/14  email
bbbb    2/10/14 won
bbbb    2/11/14 callback
bbbb    2/12/14 email
bbbb    2/13/14 won
cccc    1/14/14 won
cccc    1/16/14 call
dddd    2/3/14  email
dddd    3/3/14  won
eeee    4/19/14 won
eeee    4/21/14 call

我希望它看起来像这样:

Email   Date    Action
bbbb    2/8/14  email
bbbb    2/9/14  email
bbbb    2/10/14 won
dddd    2/3/14  email
dddd    3/3/14  won

所以基本上,通过电子邮件,如果"赢了"首先出现在Action列中,我想摆脱与该电子邮件相关的所有观察。但是,如果在第一个"赢得"之前还有其他动作。观察给定的电子邮件我想保留数据(包括观察到"赢得"的行)以及之前发生的所有事情。数据集A包含第一个被观察到的"赢得"对于每封电子邮件数据集B包含其他所有内容和所有胜利。

我已尝试使用sqldf,但它的工作不正常。任何帮助是极大的赞赏。

3 个答案:

答案 0 :(得分:7)

我不确定您需要的第一个数据是什么,此处仅尝试使用data.table来处理您的第二个数据

library(data.table)
setDT(df2)[, if(Action[1L] != "won") .SD[seq_len(match("won", Action))], by = Email]
#    Email    Date Action
# 1:  bbbb  2/8/14  email
# 2:  bbbb  2/9/14  email
# 3:  bbbb 2/10/14    won
# 4:  dddd  2/3/14  email
# 5:  dddd  3/3/14    won

答案 1 :(得分:3)

这是基础R的一个。此外,这种方法可以很容易地用于SQL。

DatasetB<-as.Date(DatesetB, "%m/%d/%Y")
DatasetA<-as.Date(DatesetA, "%m/%d/%Y")
ans <- merge(DatasetB , DatasetA, by="Email")
ans <- ans[ans$Date.x<=ans$Date.y, ]
ans <- ans[duplicated(ans$Email) | duplicated(ans$Email, fromLast=TRUE),]  #removing email's with one won

答案 2 :(得分:2)

当我在你的数据集B上以df:

运行它时,这个工作正常
>>> "x".join (["a", "b", "c"])
'axbxc'
>>> "abc".join (["M"])
'M'

按照分解的步骤更容易理解:

library(dplyr)
df2 <- slice(group_by(filter(merge(df, summarise(group_by(df, Email), first = first(Action)), all.x=TRUE), first!= "won")[,1:3], Email), 1:match("won", Action))

建议使用'dplyr'提供的管道操作符:

df_grouped <- group_by(df, Email)
dfsum <- summarise(df_grouped, first = first(Action))
df2 <- merge(df, dfsum, all.x=TRUE)
df3 <- filter(df2, first!= "won")[,1:3]
df4 <- group_by(df3, Email)
df5 <- slice(df4, 1:match("won", Action))