所以我有两个看起来像这样的数据集(表):
数据集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
,但它的工作不正常。任何帮助是极大的赞赏。
答案 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))