2016-11-08 4 views
0

Ich habe einen Datenrahmen von 15000 Obs. von 45 Variablen, mit einer ähnlichen Struktur/Modus/Klasse wie der unten angegebene Beispiel-Eingabedatenrahmen.entfernen/Teilmenge oder wählen Sie Spalten basierend auf einem Teil des Header-Namen

Was ich tun möchte ist, wählen Sie die Spalte "Datum" + Spalten mit "_MIN" als Teil der Kopfzeile und legen Sie sie in eine neue df. & Wählen Sie die Spalte "Datum" + Spalten mit "_MIN" als Teil der Kopfzeile und legen Sie sie in eine neue df.

So bin ich im Grunde auf der Suche nach eine Möglichkeit zur Auswahl oder Teilmenge ganze Spalten basierend auf einem Teil des Namens der Spaltenüberschrift. Ein Beispiel: mehrere Spalten enthalten einen "_" Unterstrich und ich möchte diese Spalten löschen oder auswählen.

INPUT dataframe: 
Example <- data.frame(Date=seq(as.Date("1979/1/1"),as.Date("1979/1/5"), by="day"), ca_MIN=1:5, ca_MAX=2:6, cb_MIN=3:7, cb_MAX=4:8) 

>Example 

    Date     ca_MIN  ca_MAX  cb_MIN  cb_MAX 
    1 1979-01-01   1   2   3   4 
    2 1979-01-02   2   3   4   5 
    3 1979-01-03   3   4   5   6 
    4 1979-01-04   4   5   6   7 
    5 1979-01-05   5   6   7   8 

OUTPUT dataframes, selected based on the column names "_MAX", "_MIN": 
Example_MIN <- data.frame(Date=seq(as.Date("1979/1/1"),as.Date("1979/1/5"),  by="day"), ca_MIN=1:5, cb_MIN=3:7) 
Example_MAX <- data.frame(Date=seq(as.Date("1979/1/1"),as.Date("1979/1/5"), by="day"), ca_MAX=2:6, cb_MAX=4:8) 

>Example_MIN 

    Date   ca_MIN cb_MIN 
    1 1979-01-01  1  3 
    2 1979-01-02  2  4 
    3 1979-01-03  3  5 
    4 1979-01-04  4  6 
    5 1979-01-05  5  7 

Im Moment mit es funktioniert:

Example_MIN <-Example 
Example_MAX <-Example 
subset(ExampleMIN,select=-c(2,4)) 
subset(ExampleMAX,select=-c(3,5)) 

Das gibt mir jedoch einen Fehler für die große Datenmenge (obwohl das Ergebnis für mich funktioniert):

Error in `[.data.table`(x, r, vars, with = FALSE) : j out of bounds 

Gibt es eine weniger umständliche Art, dies zu tun?

Ich würde es vorziehen, auch mit Datensatz mit einer großen Anzahl von Spalten zu arbeiten & mit der Spalte "_MIN" & "_MAX" nicht als ungerade und gerade Spaltennummer sortiert?

Ich habe Post gesehen, die verwandt sind, aber ich habe es nicht geschafft, so weit, einen Code zu erstellen, die bearbeitet ...

+0

'Beispiel [grepl (" _ MIN ", Namen (Beispiel))]' und 'Beispiel [grepl (" _ MAX ", Namen (Beispiel))]' –

+0

und aus der Fehlermeldung sieht es wie eine 'data.table' aus. In diesem Fall 'Beispiel [, grepl (" _ MIN ", Namen (Beispiel)), mit = F]' –

+1

@Ronak Shah. ja anscheinend irgendwo in meinem script wurde mein data.frame zu einer data.table. Deshalb haben meine früheren Versuche nicht funktioniert. Danke, dass du darauf hingewiesen hast. Das werde ich bei der nächsten Operation beachten :) –

Antwort

0

paar Möglichkeiten, dies zu tun.

grepl("_",names(Example) wird Ihnen eine Liste von trues und Falschen für diese Spalten, so:

Example[,grepl("_",names(Example)] geben Ihnen die richtig Subset data.frame.

Eine freundliche Art und Weise, dies zu tun ist mit dplyr:

Example %>% select(contains("_"))

eine Übung für Sie dann die Spalten und die Datumsspalt sein würde, wie zu wählen. Hinweis für die Base-R-Lösung: | ist OR und & ist logisch UND. Viel Glück!

+0

Ich habe 'Beispiel.max <- Beispiel [, grepl ("_ MAX", Namen (Beispiel)), mit = F]' & 'Beispiel verwendet.max <- cbind (Beispiel $ Date, Example) ' –

+0

Schließen ... aber Sie können es besser machen ... versuchen Sie, beide Bedingungen in einen zu setzen ... also 'Beispiel [, BEDINGUNGEN]'. Wenn die Bedingungen sowohl das "_" als auch das "Datum" sind. Versuchen Sie ..., mehrere Filter in einem Schritt zu spezifizieren, ist sehr wichtig für Ihre R-Fähigkeiten. Wenn du es nicht bekommst, zeige ich dir wie. Versuchen Sie auch den dplyr Weg ... wenn Sie dplyr nicht wissen, sollten Sie lernen! –

+0

Ich habe das dplyr-Paket schon einmal benutzt, aber ich kann die beiden Funktionen nicht kombinieren. Ich bin relativ neu zu R, so dass ich wahrscheinlich die meiste Zeit ineffizient arbeite .... Das dplyr-Paket würde bind_cols statt cbind richtig benutzen? und vielleicht select_if verwenden, um die Spalten auszuwählen? –

0

Try grep auf Namen, ist der Trick, einen richtigen $ ref an die Datumsspalt zu tun, wie gut

Example_MIN <- Example[ , c(Example$Date, grep('_MIN', names(Example)))] 
+0

Erzeugt den folgenden Fehler in meinem Dataset: Fehler in grep ("_ MAX"): Argument "x" fehlt, ohne Standard –

+0

yeah das liegt daran, dass Sie die Namen (x) weggelassen haben ... –

0

U kann stringr Paket verwenden und aus dem Vektor von Spaltennamen wählen:

Example <- data.frame(Date=seq(as.Date("1979/1/1"),as.Date("1979/1/5"), by="day"), ca_MIN=1:5, ca_MAX=2:6, cb_MIN=3:7, cb_MAX=4:8) 
library(stringr) 
# columns including MIN 
chosenColumns <- str_detect(names(Example), "MIN") 
#include also dates 
chosenColumns[1] <- TRUE 
mins <- Example[, chosenColumns] 
Verwandte Themen