排除超过阈值的行

时间:2017-05-19 06:23:09

标签: r filter threshold

我有一个数据集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

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

  • C_THDxL_0154x6KSFS_的 A03 x6KSF_11xaP_ACT
  • C_THDxL_0154x6KSFS_的 A03 x6KSF_11xaP_ACT

    带有 A 字符的

    不应该value大于60:

同样

  • C_THDxL_0154x6KSFS_的 B03 x6KSF_11xaP_ACT,

  • C_THDxL_0154x6KSFS_的 B03 x6KSF_11xaP_ACT

    的字符 B 不应该value大于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

3 个答案:

答案 0 :(得分:3)

您可以使用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  

答案 1 :(得分:2)

    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

答案 2 :(得分:1)

您可以使用以下代码:

# 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 ), ]

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