2012-02-01 10 views
18

Quando uso la funzione R in R per caricare i dati, trovo spesso che una X è stata aggiunta ai nomi delle variabili. Penso che lo vedo sempre nella prima variabile, ma potrei sbagliarmi.R- Perché gli X vengono aggiunti ai nomi delle variabili nel mio frame di dati?

In un primo momento, ho pensato che R potrebbe fare ciò perché avevo uno spazio all'inizio del nome della variabile - Non è così.

In secondo luogo, avevo letto da qualche parte che se si dispone di una variabile che inizia con un numero, o è un nome di variabile molto breve, R aggiungerebbe la X. Il nome della variabile è tutto il testo e la lunghezza del nome di questa la variabile è di 12 caratteri, quindi non è breve.

Ora, questo è puramente un fastidio. Posso rinominare la colonna, ma aggiunge un passaggio, anche se piccolo.

C'è un modo per impedire a questo X di infiltrarsi dal mio frame di dati?

Ecco il mio codice originale:

df <- read.csv("/file/location.filecsv", header=T, sep=",") 

Ecco la variabile in questione:

str(orders) 
'data.frame': 2620276 obs. of 26 variables: 
$ X.OrderDetailID : Factor w/ 2620193 levels "(2620182 row(s) affected)",..: 105845 
+1

potete inserire i nomi delle variabili con Xs e il codice utilizzato per leggere i dati? –

+1

Ancora non capisco * perché * sta succedendo. Il fatto che capiti (soprattutto?) Al primo nome di variabile mi suggerisce che in qualche modo sei finito con un personaggio speciale invisibile all'inizio dei tuoi file? –

risposta

32

read.table e read.csv hanno un argomento check.names= che è possibile impostare a FALSE.

Per esempio, provare con questo ingresso che consiste di solo un colpo di testa:

> read.csv(text = "a,1,b") 
[1] a X1 b 
<0 rows> (or 0-length row.names) 

contro

> read.csv(text = "a,1,b", check.names = FALSE) 
[1] a 1 b 
<0 rows> (or 0-length row.names) 
+0

check.names = FALSE è il vincitore .... Grazie per l'aiuto! – mikebmassey

3

Si tratta di un comportamento sorprendente, ma penso che avremmo bisogno di un esempio riproducibile. Forse hai alcuni caratteri invisibili/speciali nascosti nel tuo file?

names(read.csv(textConnection(
"abcdefghijkl, a1,2x"))) 

si comporta correttamente. Puoi fare un esempio seguendo queste linee che dimostra il tuo problema?

Come descritto nell'altra risposta, check.names=FALSE è una soluzione possibile. Si può sperimentare con make.names per determinare il comportamento ...

2

Come ha detto Gabor, per impostazione predefinita read.csv deafults a convertire i nomi nella vostra riga di intestazione ad essere nomi di variabili validi (utilizzare check.names = FALSE per disattivarlo). Questo viene fatto usando la funzione make.names. La pagina di aiuto per quella funzione spiega cosa costituisce un nome di variabile valido.

Un nome sintatticamente valido è costituito da lettere, numeri e il punto o caratteri di sottolineatura e inizia con una lettera o il punto non seguito da un numero. Nomi come ".2way" non sono validi e nemmeno le parole riservate di .

L'elenco di parole riservate è disponibile nella pagina di aiuto ?reserved.

L'altra condizione è che il nome della variabile deve essere di 10000 caratteri o meno, ma make.names non lo accorcia. Quindi fai attenzione ad essere veramente dettagliato con i nomi delle tue variabili.

È possibile verificare la presenza di nomi di variabili validi utilizzando

library(assertive.code) 
is_valid_variable_name(x) 
+0

A una velocità di battitura media di 200 caratteri al minuto - questo è 50 minuti per digitare ogni nome di variabile - ahi! – James

Problemi correlati