2012-02-01 6 views
18

Kiedy używam funkcji read.csv() w R do ładowania danych, często stwierdzam, że do nazw zmiennych został dodany znak X. Myślę, że zawsze widzę to w pierwszej zmiennej, ale mogę się mylić.R- Dlaczego Xs zostały dodane do nazw zmiennych w mojej ramce danych?

Początkowo myślałem, że może to zrobić R, ponieważ miałem spację na początku nazwy zmiennej - nie mam.

Po drugie, przeczytałem gdzieś, że jeśli masz zmienną, która zaczyna się od liczby lub jest bardzo krótką nazwą zmiennej, to R doda X. Nazwa zmiennej to cały tekst i długość nazwy tego zmienna ma 12 znaków, więc nie jest krótka.

To czysta irytacja. Mogę zmienić nazwę kolumny, ale dodaje ona krok, choć niewielki.

Czy istnieje sposób, aby zapobiec infekowaniu mojej ramki danych przez nieuczciwych X?

Oto mój oryginalny kod:

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

Oto zmienna w pytaniu:

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

można dodawać nazwy zmiennych z Xs a kodem używanym do czytania w danych? –

+1

Nadal nie rozumiem * dlaczego * tak się dzieje. Fakt, że to się dzieje (głównie?) Z pierwszą nazwą zmiennej sugeruje mi, że na początku twoich plików kończy się niewidzialna postać specjalna? –

Odpowiedz

32

read.table i read.csv mają check.names= argument, który można ustawić na FALSE.

Na przykład, spróbuj go z tego wejścia obejmującej tylko nagłówka:

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

kontra

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

check.names = FALSE jest zwycięzcą .... Dzięki za pomoc! – mikebmassey

3

Zaskakujące jest to zachowanie, ale myślę, że musimy się powtarzalne przykład. Być może w twoim pliku ukrywasz jakieś niewidzialne/specjalne znaki?

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

zachowuje się dobrze. Czy możesz zrobić przykład wzdłuż tych linii, który pokazuje twój problem?

Jak opisano w innej odpowiedzi, możliwe jest obejście problemu check.names=FALSE. Można eksperymentować z make.names określić zachowanie ...

2

Jak powiedział Gabor domyślnie read.csv deafults do konwersji nazwy w wierszu nagłówka być prawidłowymi nazwami zmiennych (wykorzystanie check.names = FALSE aby wyłączyć tę opcję). Odbywa się to za pomocą funkcji make.names. Strona pomocy dla tej funkcji wyjaśnia, co stanowi poprawną nazwę zmiennej.

składniowo poprawna nazwa składa się z liter, cyfr i znaków kropki lub podkreślają i zaczyna się literą lub kropką nie następuje przez liczbę. Nazwy takie jak ".2way" nie są poprawne, podobnie jak zastrzeżone słowa .

Lista zarezerwowanych słów znajduje się na stronie pomocy ?reserved.

Drugim warunkiem jest to, że nazwa zmiennej musi być 10000 znaków lub mniej, ale make.names nie skróci go. Dlatego należy zachować ostrożność bycia naprawdę gadatliwy ze swoimi nazwami zmiennych.

Można sprawdzić poprawnych nazw zmiennych używając

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

Przy średniej prędkości pisania 200 znaków na minutę - to 50 minut, aby wpisać nazwę każdej zmiennej - ouch! – James