当前位置:  开发笔记 > 编程语言 > 正文

根据不同的行条件删除组行

如何解决《根据不同的行条件删除组行》经验,为你挑选了1个好方法。

这就是我的数据框架的样子.

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]

(请注意,第三种情况包含前两种情况,所以我假设你想要三种不同的输出......否则只能坚持到最后一种情况)



1> MichaelChiri..:

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]

(请注意,第三种情况包含前两种情况,所以我假设你想要三种不同的输出......否则只能坚持到最后一种情况)

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有