2012-11-06 15 views
5

Ho un numero elevato di set di dati contenenti ciascuno un lungo elenco di nomi di colonne. In alcuni file i nomi delle colonne sono tutti maiuscoli e in alcuni file solo la prima lettera dei nomi delle colonne è in maiuscolo. Devo aggiungere i set di dati e ho pensato che il modo più semplice per far corrispondere i nomi delle colonne tra i set di dati sarebbe quello di convertire i nomi di tutti i capitali in nomi con solo la prima lettera in maiuscolo.Cambia maiuscole/minuscole dei nomi delle colonne

Spero di trovare una soluzione generale, forse anche un one-liner.

Ecco il mio set di dati di esempio. I nomi desiderati sono inclusi nelle istruzioni names.

my.data2 <- " 
landuse units grade CLAY LINCOLN BASINANDRANGE MCCARTNEY MAPLE 
apple acres AAA  0   2   3    4   6 
apple acres AA 1000  900   NA   NA  700 
pear acres AA 10.0  20   NA   30.0  40 
peach acres AAA 500  400  350   300  200 
" 
my.data2 <- read.table(textConnection(my.data2), header=TRUE) 

names(my.data2)[names(my.data2)=="CLAY"]   <- "Clay" 
names(my.data2)[names(my.data2)=="BASINANDRANGE"] <- "BasinandRange" 
names(my.data2)[names(my.data2)=="LINCOLN"]   <- "Lincoln" 
names(my.data2)[names(my.data2)=="MCCARTNEY"]  <- "McCartney" 
names(my.data2)[names(my.data2)=="MAPLE"]   <- "Maple" 

my.data2 

Si noti che ho incluso i nomi e McCartneyBasinandRange per rendere le cose più realistico e più difficile. Tuttavia, se riesco a trovare un one-liner per gestire il 95% dei nomi e utilizzare le precedenti dichiarazioni names per affrontare complicazioni come McCartney e BasinandRange sarebbe fantastico.

Ho cercato su Internet, inclusi gli archivi StackOverflow, senza trovare una soluzione. Scusa se ne ho trascurato uno. Grazie per tutto l'aiuto.

+3

Probabilmente sarebbe più facile se convertito tutti i nomi a tutto maiuscolo o tutto minuscolo utilizzando 'toupper' o' tolower', rispettivamente. Convertirli in case miste sarà più difficile. –

risposta

19

Ecco una battuta di attuazione "il modo più semplice per abbinare i nomi di colonna tra set di dati" che mi viene in mente:

## Columns 1:3 left unaltered since they are not place names. 
names(my.data2)[-1:-3] <- tolower(names(my.data2)[-1:-3]) 

## View the results 
names(my.data2) 
# [1] "landuse"  "units"   "grade"   "clay"   
# [5] "lincoln"  "basinandrange" "mccartney"  "maple" 
1

ho usato la risposta di Josh O'Brien, ma alla fine ha scritto il codice qui sotto crea nomi di colonne con la prima lettera in maiuscolo e le altre lettere in minuscolo, con alcune eccezioni gestite come nel post originale. Qui di seguito ho usato lo stesso set di dati, come nel post originale, ma leggo che i dati in modo diverso in cui R n.col determina il numero di colonne nel file di dati:

n.col <- as.numeric(length(scan("c:/users/mark w miller/simple R programs/names_with_capital_letters.txt", 
     what="character", nlines=1))) 

my.data2 <- read.table(file = "c:/users/mark w miller/simple R programs/names_with_capital_letters.txt", 
      na.string=NA, header = T, colClasses = c('character', 'character', 'character', 
      rep('numeric', (n.col[1] - 3)))) 

first.letter <- substring(names(my.data2)[-1:-3], 1, 1) 
other.letters <- tolower(substring(names(my.data2)[-1:-3], 2)) 
newnames  <- paste(first.letter, other.letters, sep="") 

names(my.data2)[-1:-3] <- newnames 
names(my.data2)[names(my.data2)=="Basinandrange"] <- "BasinandRange" 
names(my.data2)[names(my.data2)=="Mccartney"]  <- "McCartney" 

my.data2 

# landuse units grade Clay Lincoln BasinandRange McCartney Maple 
# 1 apple acres AAA 0  2    3   4  6 
# 2 apple acres AA 1000  900   NA  NA 700 
# 3 pear acres AA 10  20   NA  30 40 
# 4 peach acres AAA 500  400   350  300 200 
3

sintassi data.table, credo farebbe risparmiare più tempo ed efficiente. è anche una dichiarazione a una riga, ancora più breve.

setnames(my.data2, tolower(names(my.data2[4:8])))

# landuse units grade clay lincoln basinandrange mccartney maple 
#1: apple acres AAA 0  2    3   4  6 
#2: apple acres AA 1000  900   NA  NA 700 
#3: pear acres AA 10  20   NA  30 40 
#4: peach acres AAA 500  400   350  300 200 
Problemi correlati