【问题标题】:R subset logicalR子集逻辑
【发布时间】:2014-11-17 04:48:19
【问题描述】:

我有一个数据列表,我想根据两个变量(分区、deployment.date)进行子集化。根据文章和手册,我应该可以使用单个&符号来完成。然而,我看到的是,每一个都可以独立工作,但结合起来就不行了。

> 尾(x) 复合版本分区部署.日期 6 MaintenanceService 1.4.34.5 SpecialProgram-IneligibleCR 2014-10-01 7 MaintenanceService 1.4.34.5 SpecialProgram-IneligibleCR 2014-10-01 8 集成 1.6.1 SpecialProgram-PT 2014-10-13 9 集成 1.6.1 SpecialProgram-PT 2014-10-13 10 UpdateTermChanges 1.9.0 TermChange 2014-09-28 11 更新TermChangesV2 1.13.0.1 TermChange 2014-09-24 > x[ grep("2014-10", x$Deployment.Date) , ] 复合版本分区部署.日期 1 TermChangeEventProcessor 1.9.1.1 TermChange 2014-10-31 2 TermChangeIntegrationLayer 1.1.2.1 TermChange 2014-10-31 3 UpdateOffers 2.5.2 TermChange 2014-10-10 4 UpdateOffers 2.5.3 TermChange 2014-10-13 5 MaintenanceService 1.4.34.4 SpecialProgram-IneligibleCR 2014-10-01 6 MaintenanceService 1.4.34.5 SpecialProgram-IneligibleCR 2014-10-01 7 MaintenanceService 1.4.34.5 SpecialProgram-IneligibleCR 2014-10-01 8 集成 1.6.1 SpecialProgram-PT 2014-10-13 9 集成 1.6.1 SpecialProgram-PT 2014-10-13 > x[(x$Partition == " TermChange"), ] 复合版本分区部署.日期 1 TermChangeEventProcessor 1.9.1.1 TermChange 2014-10-31 2 TermChangeIntegrationLayer 1.1.2.1 TermChange 2014-10-31 3 UpdateOffers 2.5.2 TermChange 2014-10-10 4 UpdateOffers 2.5.3 TermChange 2014-10-13 10 UpdateTermChanges 1.9.0 TermChange 2014-09-28 11 更新TermChangesV2 1.13.0.1 TermChange 2014-09-24

但是当我将它们一起使用时,结果并不是我所期望的。

> x[( (grep("2014-10", x$Deployment.Date)) & (x$Partition == "TermChange")), ] 复合版本分区部署.日期 1 TermChangeEventProcessor 1.9.1.1 TermChange 2014-10-31 2 TermChangeIntegrationLayer 1.1.2.1 TermChange 2014-10-31 3 UpdateOffers 2.5.2 TermChange 2014-10-10 4 UpdateOffers 2.5.3 TermChange 2014-10-13 10 UpdateTermChanges 1.9.0 TermChange 2014-09-28 11 更新TermChangesV2 1.13.0.1 TermChange 2014-09-24 警告信息: 在 (grep("2014-10", x$Deployment.Date)) & (x$Partition == " TermChange") 中: 较长的对象长度不是较短对象长度的倍数

我玩过括号分组以及使用双与号。我缺少什么,以便我可以对 2014-10 部署的所有 TermChange 条目进行子集化?

谢谢。

【问题讨论】:

    标签: r logical-operators subset


    【解决方案1】:

    您混合了基于索引的子集(使用整数)和包含-排除子集(使用布尔值)。

    > x <- 9:12
    
    > grep('1', x)  # indexes
    [1] 2 3 4
    > x[grep('1', x)]
    [1] 10 11 12
    
    > grepl('1', x)  # boolean
    [1] FALSE TRUE TRUE TRUE
    > x[grepl('1', x)]
    [1] 10 11 12
    
    > x<11  # boolean
    [1]  TRUE  TRUE FALSE FALSE
    > x[x<11]
    [1] 9 10
    
    > which(x<11)  # indexes
    [1]  1 2
    > x[which(x<11)]
    [1] 9 10
    

    您只能将索引与索引结合或将布尔值与布尔值结合。

    > grepl('1',x) & x<11  # both boolean
    [1] FALSE  TRUE FALSE FALSE
    
    > intersect(grep('1',x), which(x<11))  # both indexes
    [1] 2
    
    > grep('1',x) & x<11  # mixed
    [1]  TRUE  TRUE FALSE FALSE
    Warning message:
    In grep("1", x) & x < 11 :
      longer object length is not a multiple of shorter object length
    

    【讨论】:

    • 谢谢。关于如何在不借助外部软件包的情况下将两者结合起来的任何提示?
    【解决方案2】:

    我喜欢 dplyr 包中的 filter 函数

    library(dplyr)
    filter(x, grepl("2014-10",Deployment.Date) & Partition==" TermChange"))
    

    (在本地数据上测试)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 2021-06-20
      • 2021-07-01
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多