2017-10-01 3 views
1

Ich versuche, eine positive Teilmenge speziell mit einer Kombination von dplyr::select() und dplyr :: contains() `, mit dem Ziel zu erreichen durch mehrere String-Matches zu unterteilen.Positive und negative Teilmenge mit dplyr :: contains() und dplyr :: select() in R

Minimales Arbeitsbeispiel: wenn ich mit df1 starte und eine negative Teilmenge mache, erzeuge ich df2 wie erwartet. Im Gegensatz dazu, wenn ich eine positive Teilmenge von df1 versuche, erzeuge ich df3 (keine Spalten), wenn ich etwas wie df4 erwartet hätte. Danke für jede Hilfe. Denken Sie

df1 <- data.frame("ppt_paint"=c(45,98,23),"het_heating"=c(1,1,2) ,"orm_wood"=c("QQ","OA","BB"), "hours"=c(4,6,4), "distance"=c(23,65,21)) 
df2 <- df1 %>% select(-contains("ppt_")) %>% select(-contains("het_")) %>% select(-contains("orm_")) 
df3 <- df1 %>% select(contains("ppt_")) %>% select(contains("het_")) %>% select(contains("orm_")) 
df4 <- data.frame("ppt_paint"=c(45,98,23),"het_heating"=c(1,1,2) ,"orm_wood"=c("QQ","OA","BB")) 

Antwort

0

(und haben einen Blick auf die resultierende data.frame) zu dem, was passiert nach: df1 %>% select(contains("ppt_")). Wie gefordert, behält es nur die nur Spalte, die "ppt_" enthält. Weitere Ausdrücke können nicht so funktionieren, wie Sie es erwarten, da andere Spalten, egal, was Sie gerade einspeisen, "nicht mehr" da sind.

Sie die gleiche Idee halten können, aber in den gleichen select Sie drei Tasten kombinieren:

df1 %>% select(matches("ppt_"), matches("het_"), matches("orm_")) 
    ppt_paint het_heating orm_wood 
1  45   1  QQ 
2  98   1  OA 
3  23   2  BB 

Alternativ Sie es mit matches tun können, das akzeptiert reguläre Ausdrücke:

df1 %>% select(matches(c("ppt_|het_|orm_"))) 
    ppt_paint het_heating orm_wood 
1  45   1  QQ 
2  98   1  OA 
3  23   2  BB 

Und nebenbei können Sie damit auch Ihre "negative" Indizierung verkürzen:

df1 %>% select(-matches("ppt_|het_|orm_")) 
    hours distance 
1  4  23 
2  6  65 
3  4  21