2015-03-20 9 views
5

Per alcuni motivi (non importa), i nomi dei file nel dataframe importato excel hanno duplicati come indicato di seguito (DT è la tabella di dati convertita da DF dataframe). Tuttavia, si tratta di nomi univoci e quindi la necessità di utilizzare setnames.nomi per nomi duplicati in data.table

DF<-structure(list(X1 = c("", "15 May 2014", "16 May 2014", "18 May 2014", 
"19 May 2014"), X2 = c(NaN, 746.18, 746.18, 744.34, 739.95), 
X3 = c(NaN, 549.9, 549.9, 546.5, 549.65), X1 = c(NaN, 406.57, 
406.57, 406.66, 404.73), X1 = c(NaN, 1788.86, 1788.86, 1767.69, 
1772.34), X1 = c(NaN, 2286, 2286, 2302.37, 2313.14), X2 = c(NaN, 
3639.25, 3639.25, 3622.08, 3569.53), X3 = c(NaN, 1160.13, 
1160.13, 1144.77, 1129.72), X1 = c(NaN, 182.83, 182.83, 182.83, 
182.83), X2 = c(NaN, 787.13, 787.13, 775.39, 764.82), X1 = c(NaN, 
853.2, 853.2, 849.67, 844.49)), .Names = c("X1", "X2", "X3", 
"X1", "X1", "X1", "X2", "X3", "X1", "X2", "X1"), class = c("data.table", 
"data.frame"), row.names = c(NA, -5L)) 

DT<-as.data.table(DF) 

>DT 

       X1  X2  X3  X1  X1  X1  X2  X3  X1  X2  X1 
    1:    NaN NaN NaN  NaN  NaN  NaN  NaN NaN NaN NaN 
    2: 15 May 2014 746.18 549.90 406.57 1788.86 2286.00 3639.25 1160.13 182.83 787.13 853.20 
    3: 16 May 2014 746.18 549.90 406.57 1788.86 2286.00 3639.25 1160.13 182.83 787.13 853.20 
    4: 18 May 2014 744.34 546.50 406.66 1767.69 2302.37 3622.08 1144.77 182.83 775.39 849.67 
    5: 19 May 2014 739.95 549.65 404.73 1772.34 2313.14 3569.53 1129.72 182.83 764.82 844.49 

Così, ho deciso di cambiare queste colnames utilizzando setnames, ma ottengo il seguente errore (che è ovvio):

new_names<-c("Date","BOD","DO","FI","HT","HY","IN","MA","SE","OR","RA") 
old_names<-names(DT) 
setnames(DT, old_names, new_names) 

Error in setnames(DT, old_names, new_names) : 
    Some duplicates exist in 'old': X1,X1,X1,X2,X3,X1,X2,X1 

Così, ho fatto ricorso a data.frame modo di cambiare colnames

names(DT)<-new_names # this doesn't give any error but still gives warnings 

Warning message: 
In `names<-.data.table`(`*tmp*`, value = c("Date", "BOD", "DO", : 
    The names(x)<-value syntax copies the whole table. This is due to <- in R itself. Please change to setnames(x,old,new) which does not copy and is faster. See help('setnames'). You can safely ignore this warning if it is inconvenient to change right now. Setting options(warn=2) turns this warning into an error, so you can then use traceback() to find and change your names<- calls. 
> DT 
      Date BOD  DO  FI  HT  HY  IN  MA  SE  OR  RA 
1:    NaN NaN NaN  NaN  NaN  NaN  NaN NaN NaN NaN 
2: 15 May 2014 746.18 549.90 406.57 1788.86 2286.00 3639.25 1160.13 182.83 787.13 853.20 
3: 16 May 2014 746.18 549.90 406.57 1788.86 2286.00 3639.25 1160.13 182.83 787.13 853.20 
4: 18 May 2014 744.34 546.50 406.66 1767.69 2302.37 3622.08 1144.77 182.83 775.39 849.67 
5: 19 May 2014 739.95 549.65 404.73 1772.34 2313.14 3569.53 1129.72 182.83 764.82 844.49 

Quindi, mi chiedevo se esiste un metodo data.table (univoco) per cambiare i nomi quando i nomi non sono univoci (anche in questo caso i dati sono stati importati da Excel).

risposta

9

È possibile omettere i old_names:

setnames(DT, new_names) 

Lavoreranno assumendo new_names ha tutti i nomi nell'ordine corretto. Da ?setnames:

setnames(x,old,new):
old: Quando il nuovo è fornito, i nomi dei personaggi o posizioni numeriche di nomi di colonna per cambiare. Quando non viene fornito nuovo, i nuovi nomi di colonna, che devono avere la stessa lunghezza del numero di colonne. Vedi esempi.

+0

Grazie per l'aiuto. – user227710

0

Mi sono imbattuto nello stesso problema ma non mi interessava sapere quali nuovi nomi possono ottenere le colonne, quindi ho semplicemente bisogno di nomi univoci. Combinando make.unique o make.names (come suggerito here) con setnames (come sottolineato da @BrodieG above) risolto il problema:

# considering your DT object: 
setnames(DT, make.unique(names(DT))) 
# The new column names are: 
names(DT) 
## [1] "X1" "X2" "X3" "X1.1" "X1.2" "X1.3" "X2.1" "X3.1" "X1.4" "X2.2" "X1.5" 
# Same can be achieved with: 
setnames(DT, make.names(names(DT), unique = TRUE)) 
Problemi correlati