2016-10-20 2 views
0

Ich habe ein Atom Vektor wie:Ändern Spaltennamen in Datenrahmen mit gsub

col_names_to_be_changed <- c("PRODUCTIONDATE", "SPEEDRPM", "PERCENTLOADATCURRENTSPEED", sprintf("SENSOR%02d", 1:18)) 

ich _ zwischen den Wörtern haben möchten, haben sie alle Kleinbuchstaben, mit Ausnahme ersten Buchstaben der Wörter (nach R Style for dataframes from advanced R). Ich möchte so etwas haben:

new_col_names <- c("Production_Date", "Percent_Load_At_Current_Speed", sprintf("Sensor_%02d", 1:18)) 

wird angenommen, dass meine Worte auf diese Liste beschränkt sind:

list_of_words <- c('production', 'speed', 'percent', 'load', 'at', 'current', 'sensor') 

ich eines Algorithmus denke, dass gsub verwendet, setzt _ wo immer es findet Wort aus der obigen Liste und dann Großbuchstaben den ersten Buchstaben jedes Wortes. Obwohl ich das manuell machen kann, würde ich gerne lernen, wie dies mit gsub schöner gemacht werden kann. Vielen Dank.

+0

Sie wollen wahrscheinlich nicht 'gsub'. Da Sie eine Wörterbuchliste haben, ist es wahrscheinlich besser, eine Extraktionsfunktion wie 'regmatches' zu verwenden. Aber ich habe das Gefühl, dass Paket * stringi * (oder sein Wrapper * stringr *) am besten dafür wegen seiner Vektorisierung über alle Argumente funktioniert. –

+0

sollten Sie mehr Aufwand zeigen 'gsub ('(? <=^| _) ([Az])', '\\ U \\ 1', gsub (sprintf ('(? I) (? <=% S) (? =. {2,}) ', einfügen (list_of_words, collapse =' | ')),' _ ', tolower (col_names_to_be_changed), perl = TRUE), perl = TRUE) ' – rawr

+0

@rawr das hat perfekt funktioniert. Können Sie das zu einer Lösung machen, damit andere es in Zukunft nutzen können? Der erste 'gsub' erledigt die Aufgabe' gsub (sprintf ('(? I) (? <=% S) (? =. {2,})'), einfügen (list_of_words, collapse = '|')), '_', tolower (col_names_to_be_changed), perl = TRUE) 'und dann der andere' gsub' kapitalisiert die ersten Buchstaben. Vielen Dank. – ahoosh

Antwort

2

Sie können die Liste der Wörter nehmen und sie mit einem Look-Behind ((?<=)) einfügen. Ich fügte die (?=.{2,}) hinzu, weil dies auch die "AT" in "DATE" passt, da "AT" in der Liste der Wörter ist, so müssen zwei oder mehr Zeichen gefolgt werden, um mit geteilt zu werden ein Unterstrich.

Der zweite gsub tut nur die Großschreibung

list_of_words <- c('production', 'speed', 'percent', 'load', 'at', 'current', 'sensor') 
col_names_to_be_changed <- c("PRODUCTIONDATE", "SPEEDRPM", "PERCENTLOADATCURRENTSPEED", sprintf("SENSOR%02d", 1:18)) 


(pattern <- sprintf('(?i)(?<=%s)(?=.{2,})', paste(list_of_words, collapse = '|'))) 
# [1] "(?i)(?<=production|speed|percent|load|at|current|sensor)(?=.{2,})" 

(split_words <- gsub(pattern, '_', tolower(col_names_to_be_changed), perl = TRUE)) 
# [1] "production_date"    "speed_rpm"      "percent_load_at_current_speed" 
# [4] "sensor_01"      "sensor_02"      "sensor_03"      

gsub('(?<=^|_)([a-z])', '\\U\\1', split_words, perl = TRUE) 
# [1] "Production_Date"    "Speed_Rpm"      "Percent_Load_At_Current_Speed" 
# [4] "Sensor_01"      "Sensor_02"      "Sensor_03"      
+0

Gibt es eine Möglichkeit, Wörter aus einer Liste Großbuchstaben 'c (" rpm "," egt ") zu behalten? Obwohl ich hier nicht "egt" habe, aber in meinen Daten habe ich es. Oder vielleicht können wir sie wieder in Kapital verwandeln? – ahoosh

+0

@bikhaab auch als Brute-Force, könnten Sie einen ähnlichen Ansatz wie oben 'pat <- sprintf ('(? I) (% s)', einfügen (cap_list, collapse = '|')); gsub (pat, '\ U \ 1', tolower (col_names_to_be_changed), perl = TRUE) ' – rawr

Verwandte Themen