2012-10-24 8 views
9

nadzieję, że ktoś może mi pomóc zrozumieć, dlaczego błędny \ n znaków są wyświetlane w wektorze ciągów, który tworzę w R.Dlaczego i gdzie n znaki nowej linii są wprowadzane do c()?

próby importowania i oczyścić bardzo szeroki plik danych, który znajduje się w ustalonym formacie szerokość (http://www.state.nj.us/education/schools/achievement/2012/njask6/, "Plik tekstowy dla przebiegów danych"). Zastosowano UCLA tutorial w przypadku używania znakomitego pytania SO o nazwie read.fwf i this, aby podać nazwy kolumn po zaimportowaniu.

Ponieważ plik jest naprawdę szeroki, nagłówki kolumn są długie - wszystkie razem, nieco poniżej 29 800 znaków. Jestem przekazując je w jak prosty wektorze ciągów:

column_names <- c(...) 

będę oszczędzić brzydkie zrzut tutaj, ale rzuciłem całą rzecz na pastebin.

Czyściłem i przekształcałem niektóre zmienne do analizy, gdy zauważyłem, że niektóre z moich podzestawów zwracały 0 wierszy. Po zastanowieniu się nad tym (czy coś źle napisałem?) Zdałem sobie sprawę, że jakoś grupa "\ n" znaków nowej linii została wprowadzona do nagłówków kolumn.

Gdybym pętla nad COLUMN_NAMES wektorem, który został utworzony

for (i in 1:length(column_names)) { 
    print(column_names[i]) 
} 

widzę pierwszy znak nowej linii w środku 81. kolejce -

SPECIAL \ nEDUCATION SCIENCE Liczba uczestniczących Nauki

Aleje, które próbowałem rozwiązać:

1) Czy jest to coś w moim środowisku? Używam zwykłego edytora skryptów w R i zawijam linie do - ale przerwy na moim ekranie nie pasują do położenia znaków \ ​​n, co sugeruje mi, że nie jest to edytor skryptów R.

2) Czy jest ustawienie GUI? Czy niektóre searching, ale nie można znaleźć niczego.

3) Czy istnieje wzór? Wygląda na to, że znaki nowej linii są wstawiane na około 4000 znaków. Czy trochę czytania na temat prymitywów R/S, aby spróbować dowiedzieć się, czy to ma coś wspólnego z podstawowymi strukturami danych R, ale było dość szybko w mojej głowie.

Próbowałem podzielić długi ciąg na shorter chunks, a następnie połączyć je i to wydawało się rozwiązać problem.

column_names.1 <- c(...) 
column_names.2 <- c(...) 
column_names_combined <- c(column_names.1, column_names.2) 

więc mam natychmiastowe obejście, ale chciałbym wiedzieć, co się tutaj dzieje.

Niektóre posts, że miał do czynienia z problemami z wektorami znaków zasugerował, że biegnę profil pamięci:

memory.profile() 
     NULL  symbol pairlist  closure environment  promise 
      1  9572  220717  4734  1379  5764 
    language  special  builtin  char  logical  integer 
     63932   165  1550  18935  10302  30428 
     double  complex character   ...   any  list 
     2039   1  60058   0   0  20059 
    expression bytecode externalptr  weakref   raw   S4 
      1  16553   725   150   151  1162 

biegnę R 2.15.1 (64-bit) R na Windows 7 (Enterprise , SP 1, 8 gigabajtów RAM). Dzięki!

+2

W jaki sposób wykonujecie kod w pastebin? Czy kopiujesz i wklejasz? Lub pozyskać go z pliku? Lub w inny sposób? – hadley

+0

Nowy skrypt, a następnie kopiowanie i wklejanie, tak. Nie pochodzi z pliku. – Andrew

+0

To jest błąd kopiowania i wklejania w (myślę) R (lub być może klienta R, którego używasz) - po prostu pobierz go z pliku. – hadley

Odpowiedz

12

Wątpię, że to błąd.Zamiast tego wygląda na to, że używasz znanego ograniczenia konsoli. Jak mówi Section 1.8 - R commands, case sensitivity, etc. z An Introduction to R:

linii poleceń wpisany na konsoli są ograniczone [3] do około 4095 bajtów (nie znaków).

[3] Niektóre konsole nie pozwolą ci wprowadzić więcej, a spośród tych, które są używane, w milczeniu odrzucimy nadmiar, a niektórzy użyją go jako początku następnego wiersza.

Albo umieścić polecenie w pliku i source go lub złamać kod do wielu linii, wstawiając własne nowe linie w odpowiednich punktach (pomiędzy przecinkami). Na przykład:

column_names <- 
    c("County Code/DFG/Aggregation Code", "District Code", "School Code", 
    "County Name", "District Name", "School Name", "DFG", "Special Needs", 
    "TOTAL POPULATION TOTAL POPULATION Number Enrolled LAL", ...) 
+0

Fantastyczny - doceń to. Ktoś, kto ma lepszy wgląd w R/S, wie, dlaczego ograniczenie to wynosi 4095 bajtów? Czy to ograniczenia struktury danych używane do przechowywania/przechowywania konsoli? Intencjonalna decyzja projektowa? – Andrew

+3

@Andrew: jest zakodowany w 'src/include/Defn.h':' #define CONSOLE_BUFFER_SIZE 4096', więc jest ograniczeniem struktury danych. –

Powiązane problemy