2013-06-17 9 views
12

Używam R do wstępnego przetwarzania danych, a tutaj jest problem, z którym mam do czynienia: wprowadzam dane za pomocą read.csv(filename,header=TRUE), a następnie spacja w nazwach zmiennych staje się ".", Na przykład zmienną o nazwie Pełny kod został Full.Code w wygenerowanej ramce danych. Po przetworzeniu używam write.xlsx(filename) do eksportowania wyników, podczas gdy nazwy zmiennych są zmieniane. Jak rozwiązać ten problem?Jak wymienić "." w nazwach kolumn generowanych przez read.csv() z pojedynczym odstępem podczas eksportowania?

Poza tym w pliku wyjściowym .xlsx pierwsza kolumna staje się indeksami (tj. Od 1 do N), co nie jest tym, czego się spodziewam.

+4

You może uniknąć konieczności poprawiania nazw przez wywołanie 'read.csv' z opcją' check.names = FALSE'. –

Odpowiedz

22

Jeśli zestaw check.names=FALSE w read.csv po odczytaniu danych, nazwy nie zostaną zmienione i nie będzie trzeba ich edytować przed zapisaniem danych z powrotem. Oznacza to oczywiście, że będziesz potrzebował podawać nazwy kolumn (w niektórych przypadkach cytaty z powrotem) lub odnosić się do kolumn według lokalizacji, a nie nazwy podczas edycji.

+0

Myślę, że użycie 'check.names = FALSE' jest lepszym wyborem niż edycja nazw kolumn, chociaż ponowne odczytanie danych zawiera dużo pracy dla mnie. W sumie, dziękuję za odpowiedź! To bardzo mi pomaga. –

8

Aby dostać przestrzenie z powrotem w nazwach, to zrobić (tuż przed Export - R nie pozwalają mieć spacji w nazwach zmiennych, ale jest to ból):

# A simple regular expression to replace dots with spaces 
# This might have unintended consequences, so be sure to check the results 
names(yourdata) <- gsub(x = names(yourdata), 
         pattern = "\\.", 
         replacement = " ") 

Aby usunąć indeks pierwszej kolumny , po prostu dodaj row.names = FALSE do swojego write.xlsx(). Jest to powszechny argument dla funkcji wypisujących dane w formacie tabelarycznym (ma to również write.csv()).

+0

Wielkie dzięki! Funkcja 'gsub()' działa poprawnie. Ale wciąż mam pytanie: dlaczego powinniśmy używać dwóch _escapes_ zamiast po prostu używać 'pattern =" \. "'? –

+0

@zenotsang Dobre pytanie - nie jestem pewien, dlaczego R wymaga tego. –

+2

Pierwsza ucieczka jest używana, gdy analizator R analizuje ciąg, pozostawia "\" dla wyrażenia regularnego. Jeśli pominiesz zwykły analizator składni, możesz uniknąć pojedynczego ukośnika odwrotnego (ale to prawdopodobnie więcej pracy, niż jest warta). –

3

Oto funkcja (przepraszam, wiem, że może to być refactored), który sprawia, że ​​ładne nazwy kolumn, nawet jeśli istnieje wiele kolejnych punktów i końcowe punkty:

makeColNamesUserFriendly <- function(ds) { 
    # FIXME: Repetitive. 

    # Convert any number of consecutive dots to a single space. 
    names(ds) <- gsub(x = names(ds), 
        pattern = "(\\.)+", 
        replacement = " ") 

    # Drop the trailing spaces. 
    names(ds) <- gsub(x = names(ds), 
        pattern = "()+$", 
        replacement = "") 
    ds 
} 

Przykład wykorzystania:

ds <- makeColNamesUserFriendly(ds) 
Powiązane problemy