这就是我的数据框架的样子.
dt <- read.table(text=' Name ActivityType GrpID John Sale 1 John Sale 2 John Webinar 3 Kyle Email 1 Kyle Seminar 2 Kyle Sale 3 Kyle Webinar 4 Kyle Sale 5 Tom Email 1 Tom Video 2 Tom Seminar 3 ', header=T, row.names = NULL)
我想做3件事.
删除组的(名称是组)第一个ActivityType的行是"Sale".这将删除Name = John的行
删除没有ActivityType = Sale的行.这将删除Name = Tom的行
返回第一个ActivityType不是"Sale"的剩余组,但在稍后的某行中有一个ActivityType ="Sale"(如1和2中所述)并且仅显示ActivityType = Sale的第一个实例的结果.所以应该表明
Name ActivityType GrpID Kyle Email 1 Kyle Seminar 2 Kyle Sale 3
它不必是所描述的3个步骤.我只需要最终输出.我在考虑在data.table中使用SD功能,但不知道如何添加这些条件.我将衷心感谢你的帮助.
MichaelChiri.. 7
在data.table
:
setDT(dt) sl <- "Sale" #since we re-use it so much... #1) dt[ , if (!ActivityType[1L] == sl) .SD, by = Name] #2) dt[ , if (any(ActivityType == sl)) .SD, by = Name] #3) dt[ , {x <- ActivityType == sl; if(!x[1] & any(x)) .SD[1:which.max(x)]}, by = Name]
(请注意,第三种情况包含前两种情况,所以我假设你想要三种不同的输出......否则只能坚持到最后一种情况)
在data.table
:
setDT(dt) sl <- "Sale" #since we re-use it so much... #1) dt[ , if (!ActivityType[1L] == sl) .SD, by = Name] #2) dt[ , if (any(ActivityType == sl)) .SD, by = Name] #3) dt[ , {x <- ActivityType == sl; if(!x[1] & any(x)) .SD[1:which.max(x)]}, by = Name]
(请注意,第三种情况包含前两种情况,所以我假设你想要三种不同的输出......否则只能坚持到最后一种情况)