【问题标题】:Exclude rows surpassing threshold value排除超过阈值的行
【发布时间】:2017-10-19 03:45:24
【问题描述】:

我有一个数据集df

  field_pointpath                       assetclass_code value
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT      6KSFS_6KSF   50
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT      6KSFS_6KSF   60
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT      6KSFS_6KSF   65
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT      6KSFS_6KSF   43
C_THDxL_0154x6KSFS_A03xaP_ACT                  6KSFS    70
C_THDxL_0154x6KSFS_A03xaP_ACT                  6KSFS    55
C_THDxL_0154x6KSFS_A03xaP_ACT                  6KSFS    43
C_THDxL_0154x6KSFS_A03xaP_ACT                  6KSFS    11
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACT     6KSFS_6KSF    67
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACT     6KSFS_6KSF    36
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACT     6KSFS_6KSF    39
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACT     6KSFS_6KSF    33
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACT     6KSFS_6KSF    20
C_THDxL_0154x6KSFS_B03xaP_ACT                  6KSFS    21
C_THDxL_0154x6KSFS_B03xaP_ACT                  6KSFS    22
C_THDxL_0154x6KSFS_B03xaP_ACT                  6KSFS    17
C_THDxL_0154x6KSFS_B03xaP_ACT                  6KSFS    30

我想为特定的field_pointpath 过滤掉values 例如:

  • C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT
  • C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT

    具有字符 Avalue 不应大于 60:

类似

  • C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACT,

  • C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACT

    具有字符 Bvalue 不应大于 30

因此输出应该是

                    field_pointpath    assetclass_code  value
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT   6KSFS_6KSF       50
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT   6KSFS_6KSF       60
C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT   6KSFS_6KSF       43
C_THDxL_0154x6KSFS_A03xaP_ACT              6KSFS         55
C_THDxL_0154x6KSFS_A03xaP_ACT              6KSFS         43
C_THDxL_0154x6KSFS_A03xaP_ACT              6KSFS         11
C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACT   6KSFS_6KSF       20
C_THDxL_0154x6KSFS_B03xaP_ACT              6KSFS         21
C_THDxL_0154x6KSFS_B03xaP_ACT              6KSFS         22
C_THDxL_0154x6KSFS_B03xaP_ACT              6KSFS         17
C_THDxL_0154x6KSFS_B03xaP_ACT              6KSFS         30

【问题讨论】:

    标签: r filter threshold


    【解决方案1】:

    您可以使用regular expression 过滤field_pointpath。我假设您正在寻找有 _A_B 后跟 2 位数字的条目。然后你将它与value 上的过滤器结合起来:

    ind <- (grepl("\\_A[0-9]{2}", df$field_pointpath) & df$value > 60) | 
           (grepl("\\_B[0-9]{2}", df$field_pointpath) & df$value > 30)
    df[!ind, ]
    
    #                          field_pointpath assetclass_code value
    # 1  C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT      6KSFS_6KSF    50
    # 2  C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT      6KSFS_6KSF    60
    # 4  C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT      6KSFS_6KSF    43
    # 6          C_THDxL_0154x6KSFS_A03xaP_ACT           6KSFS    55
    # 7          C_THDxL_0154x6KSFS_A03xaP_ACT           6KSFS    43
    # 8          C_THDxL_0154x6KSFS_A03xaP_ACT           6KSFS    11
    # 13 C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACT      6KSFS_6KSF    20
    # 14         C_THDxL_0154x6KSFS_B03xaP_ACT           6KSFS    21
    # 15         C_THDxL_0154x6KSFS_B03xaP_ACT           6KSFS    22
    # 16         C_THDxL_0154x6KSFS_B03xaP_ACT           6KSFS    17
    # 17         C_THDxL_0154x6KSFS_B03xaP_ACT           6KSFS    30  
    

    【讨论】:

    • 感谢您的解决方案。好吧,这似乎是一种更微妙的方法,但 substr 对我来说很顺利。
    • substr 方法假定 A/B 总是 在字符串中的第 20 位。如果你能保证你应该去substr。如果您需要包含更多案例,您可能需要返回regex
    • 我会记住这个建议。目前数据在固定位置有字符串。
    【解决方案2】:

    您可以使用以下代码:

    # your data, with 2 lines appended that will not be selected
    my_df  <- read.table(header = TRUE, 
    text = "field_pointpath                       assetclass_code value
    C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT      6KSFS_6KSF   50
    C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT      6KSFS_6KSF   60
    C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT      6KSFS_6KSF   65
    C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT      6KSFS_6KSF   43
    C_THDxL_0154x6KSFS_A03xaP_ACT                  6KSFS    70
    C_THDxL_0154x6KSFS_A03xaP_ACT                  6KSFS    55
    C_THDxL_0154x6KSFS_A03xaP_ACT                  6KSFS    43
    C_THDxL_0154x6KSFS_A03xaP_ACT                  6KSFS    11
    C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACT     6KSFS_6KSF    67
    C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACT     6KSFS_6KSF    36
    C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACT     6KSFS_6KSF    39
    C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACT     6KSFS_6KSF    33
    C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACT     6KSFS_6KSF    20
    C_THDxL_0154x6KSFS_B03xaP_ACT                  6KSFS    21
    C_THDxL_0154x6KSFS_B03xaP_ACT                  6KSFS    22
    C_THDxL_0154x6KSFS_B03xaP_ACT                  6KSFS    17
    C_THDxL_0154x6KSFS_B03xaP_ACT                  6KSFS    30
    C_THDxL_0154x6KSFS_C03xaP_ACT                  6KSFS    30 ## added
    C_THDxL_0154x6KSFS_D03xaP_ACT                  6KSFS    30 ## added
    ")
    
    library(stringr)
        my_df2 <- my_df[ (str_detect( my_df$field_pointpath, "_A03") & my_df$value <= 30) 
    | ( str_detect(my_df$field_pointpath, "_B03")  & my_df$value <= 60 ), ]
    

    请告诉我这是否是你想要的。

    【讨论】:

    • 我尝试了这个解决方案,但不幸的是它抛出了一个错误。无论如何,使用其他成员提供的解决方案对我来说很有效。谢谢
    • 我再次测试了上面的代码,结果运行顺利。如果您仍然感兴趣,可以告诉我抛出的错误吗?
    【解决方案3】:
        df[(substr(df$field_pointpath, 20,20)=="A" & df$value <= 60) |
             (substr(df$field_pointpath, 20,20)=="B" & df$value <= 30),]
    
    1  C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT      6KSFS_6KSF    50
    2  C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT      6KSFS_6KSF    60
    4  C_THDxL_0154x6KSFS_A03x6KSF_11xaP_ACT      6KSFS_6KSF    43
    6          C_THDxL_0154x6KSFS_A03xaP_ACT           6KSFS    55
    7          C_THDxL_0154x6KSFS_A03xaP_ACT           6KSFS    43
    8          C_THDxL_0154x6KSFS_A03xaP_ACT           6KSFS    11
    13 C_THDxL_0154x6KSFS_B03x6KSF_11xaP_ACT      6KSFS_6KSF    20
    14         C_THDxL_0154x6KSFS_B03xaP_ACT           6KSFS    21
    15         C_THDxL_0154x6KSFS_B03xaP_ACT           6KSFS    22
    16         C_THDxL_0154x6KSFS_B03xaP_ACT           6KSFS    17
    17         C_THDxL_0154x6KSFS_B03xaP_ACT           6KSFS    30
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      相关资源
      最近更新 更多