2015-02-16 10 views
12

Sto cercando di estrarre le colonne da un DT per un nuovo DT utilizzando selezionare {dplyr}dplyr "Select" - Errore: trovati nome di colonna duplicato

extract_Data <- select(.data = master_merge, subjectID, activity_ID, 
          contains("mean\\(\\)"), contains("std\\(\\)")) 

ci sono 563 colonne in modo da sto chiedendo di estrarre il prima e seconda colonna (soggetto, attività) e tutte le altre colonne in cui è presente mean() o std().

Non ci sono colonne duplicate che possono essere create qui. così perplesso sul perché. Ho provato ogni variazione di select ma sempre Error: Duplicated Column name.

Come posso risolvere questo problema - Ho esaminato tutti i nomi di 563 colonne e non ci sono duplicati.

+1

Cosa succede se si esegue 'matches (" (mean | std) \\ (. * \\) ")' invece delle due attuali istruzioni 'contains'? ...modificato per usare 'matches' invece di' contains' –

+0

stesso errore "Errore: trovato il nome della colonna duplicato" – scopa

+0

Anche con 'matches'? –

risposta

8

I duplicati del filtro di corrispondenza possono causare l'errore "nome duplicato". Esempio:

library(dplyr) 
x <- data.frame(1, 2, 3) 
names(x) <- c("a", "a", "b") 

x %>% 
    select(matches("b")) 

Se non avete bisogno di quelle colonne, eliminarli con

x <- x[ !duplicated(names(x)) ] 
+1

Questo è chiaro - quello che non capisco è il motivo per cui questo viene restituito come duplicato - fBodyAcc-bandsEnergy() - 1,8 "" fBodyAcc-bandsEnergy() - 9,16 "e" fBodyGyro- bandsEnergy() - 1,24 "" fBodyGyro-bandsEnergy() - 25,48 " – scopa

+0

ma non sono duplicati! – scopa

+0

La funzione 'duplicata' non restituisce la prima occorrenza del duplicato. Prova 'which (names (master_merge) ==" fBodyAcc-bandsEnergy() - 1,8 ")' – bergant

29

La radice del problema è caratteri non validi nei nomi delle colonne originali. La discussione in Variable Name Restrictions in R si applica anche ai nomi di colonna. Prova a forzare nomi di colonne univoci con validi caratteri, con make.names().

valid_column_names <- make.names(names=names(master_merge), unique=TRUE, allow_ = TRUE) 
names(master_merge) <- valid_column_names 
+0

Ottima soluzione. Molto conciso e generalizzabile. – Mikuana

-3

Prima di assegnare i nomi delle colonne filtrare le colonne da ottenere un elenco di indici usando

meanStdColumns <- grep("mean|std", features$V2, value = FALSE) 

e quindi assegnare i nomi delle colonne utilizzando

meanStdColumnsNames <- grep("mean|std", features$V2, value = TRUE) 
0

Non è una risposta diretta, ma questo aiuterà molte persone.

Per tutti gli studenti di Coursera che affrontano questo problema con questo set di dati: ci sono nomi di colonne duplicati. Ad esempio, "fBodyAccJerk-bandsEnergy() - 1,16" viene trovato due volte. Controllare:

your_merged_data_with_column_names[,400:420]

Mi piacerebbe mostrare l'uscita, ma il browser non supporta il pulsante di 'codice', né la combinazione di tasti Ctrl-K e non c'è troppi dati al rientro a mano. Prova questo codice per te stesso e controlla attentamente le "Variabili non mostrate"!

Attualmente sto lavorando a una soluzione, possibilmente utilizzando le risposte precedenti o il forum del corso.

11

Ecco la soluzione che ho trovato:

data <- data[ , !duplicated(colnames(data))] 

Questa sottoinsiemi il set di dati, senza tutte le colonne duplicati.

Spero che aiuti.

-1

Sono rimasto perplesso dallo stesso errore. Evita di usare select. Se meanStdcolumns è l'elenco di colonne che contengono mean o std (che puoi ottenere usando grep), allora master_merge [, meanStdcolumns] sembra funzionare.

Problemi correlati