2017-05-19 2 views
3

ich einen Datensatz dfAusschließen Reihen Schwellenwert übertraf

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 

Ich möchte herausfiltern values für spezifische field_pointpath zum Beispiel haben:

  • C_THDxL_0154x6KSFS_ A03 x6KSF_11xaP_ACT
  • C_THDxL_0154x6KSFS_ A03 x6KSF_11xaP_ACT

    die einen Charakter hat A sollte nicht value größer als 60:

Ähnlich,

  • C_THDxL_0154x6KSFS_ B03 x6KSF_11xaP_ACT,

  • C_THDxL_0154x6KSFS_ B03 x6KSF_11xaP_ACT

    die ein Zeichen B hat sollte nicht value mehr als 30

So sollte eine Ausgabe

    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 

Antwort

3

sein können Sie regular expression verwenden, um Filter auf field_pointpath. Ich gehe davon aus, dass Sie nach Einträgen suchen, wo es _A oder _B gefolgt von 2 Ziffern gibt. Dann kombinieren Sie das mit dem Filter auf 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 
+0

Vielen Dank für die Lösung. Nun, das scheint subtiler zu sein, aber substr lief reibungslos für mich. – user3301082

+0

Der 'substr'-Ansatz geht davon aus, dass * A/B * _always_ an der 20. Stelle in der Zeichenfolge ist. Wenn Sie garantieren können, dass Sie für "substr" gehen sollten. Wenn Sie mehr Fälle erfassen möchten, können Sie zu "Regex" zurückkehren. – thothal

+0

Ich werde diesen Rat in meinem Kopf behalten. Gegenwärtig hatten die Daten Strings an einer festen Position. – user3301082

1

Sie den folgenden Code verwenden:

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

Bitte, lassen Sie mich wissen, ob dies ist, was Sie wollten.

+0

Ich habe diese Lösung versucht, aber leider hat es einen Fehler geworfen. Wie auch immer, es hat sich für mich bewährt, die Lösung von anderen Mitgliedern zu verwenden. Danke – user3301082

+0

Ich testete den Code oben nochmals, und es lief glatt an meinem Ende. Wenn Sie noch interessiert sind, können Sie mir den Fehler mitteilen? – KoenV

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 
+0

danke, Ihre Lösung hat für mein Problem funktioniert. – user3301082