Mam plik csv, w którym niektóre wartości liczbowe są wyrażone jako ciągi z przecinkami jako separator tysięcy, np. "1,513"
Zamiast 1513
. Jaki jest najprostszy sposób wczytania danych do R?
Mogę użyć read.csv(..., colClasses="character")
, ale potem muszę usunąć przecinki z odpowiednich elementów przed konwersją tych kolumn na numeryczne i nie mogę znaleźć zgrabnego sposobu, aby to zrobić.
setAs("character", "logical.Y.N", function(from) c(Y=TRUE,N=FALSE)[from] )
).setClass("num.with.commas")
albosuppresMessage(setAs(.....))
żeby uniknąć komunikatu o brakującej klasie.Chcę używać języka R zamiast wstępnie przetwarzać dane, ponieważ ułatwia to zmianę danych. Zgodnie z sugestią Shane'a dotyczącą używania
gsub
, myślę, że jest to tak schludne, jak tylko mogę:źródło
To pytanie ma kilka lat, ale ja się na nie natknąłem, co oznacza, że może inni.
readr
Biblioteki / opakowanie ma kilka ciekawych funkcji do niego. Jeden z nich to dobry sposób na interpretację „niechlujnych” kolumn, takich jak te.To daje
Źródło: lokalna ramka danych [4 x 1]
Ważna kwestia podczas czytania w plikach: musisz albo wstępnie przetworzyć, jak w powyższym komentarzu
sed
, albo musisz przetwarzać podczas czytania . Często, jeśli próbujesz naprawić rzeczy po fakcie, pojawiają się niebezpieczne założenia, które trudno znaleźć. (Dlatego właśnie płaskie pliki są tak złe w pierwszej kolejności).Na przykład, gdybym nie oznaczył flagi
col_types
, uzyskałbym to:(Zauważ, że teraz jest to a
chr
(character
) zamiast anumeric
.)Lub, co bardziej niebezpieczne, gdyby był wystarczająco długi i większość wczesnych elementów nie zawierała przecinków:
(takie, że kilka ostatnich elementów wygląda jak :)
Wtedy będziesz mieć problemy z odczytaniem tego przecinka!
źródło
dplyr
rozwiązanie wykorzystującemutate_all
i rurpowiedz, że masz:
i chcesz usunąć przecinki ze zmiennych roku X2014-X2016 i przekonwertować je na numeryczne. powiedzmy również, że X2014-X2016 są odczytywane jako współczynniki (domyślnie)
mutate_all
stosuje funkcje wewnątrzfuns
określonych kolumnZrobiłem to sekwencyjnie, jedną funkcję na raz (jeśli używasz wielu funkcji w środku
funs
, tworzysz dodatkowe, niepotrzebne kolumny)źródło
mutate_each
jest przestarzałe. Czy chcesz zaktualizować swoją odpowiedź za pomocąmutate_at
lub podobną?„Preprocess” w R:
Można używać
readLines
natextConnection
. Następnie usuń tylko przecinki znajdujące się między cyframi:Warto również wiedzieć, ale nie jest to bezpośrednio związane z tym pytaniem, że przecinki jako separatory dziesiętne mogą być obsługiwane przez read.csv2 (automagicznie) lub read.table (z ustawieniem parametru „dec”).
Edycja: Później odkryłem, jak używać colClasses, projektując nową klasę. Widzieć:
Jak załadować df z separatorem 1000 w R jako klasę numeryczną?
źródło
Jeśli liczba jest oddzielona znakiem „.” i dziesiętne przez „,” (1.200.000,00) dzwoniąc
gsub
, musiszset fixed=TRUE as.numeric(gsub(".","",y,fixed=TRUE))
źródło
Bardzo wygodnym sposobem jest
readr::read_delim
-rodzina. Biorąc przykład stąd: Importując csv z wieloma separatorami do R , możesz to zrobić w następujący sposób:Co daje oczekiwany wynik:
źródło
Korzystając z funkcji read_delim, która jest częścią biblioteki readr , możesz określić dodatkowy parametr:
* Średnik w drugiej linii oznacza, że read_delim odczyta wartości oddzielone średnikami w pliku CSV.
Pomoże to odczytać wszystkie liczby z przecinkiem jako prawidłowe liczby.
pozdrowienia
Mateusz Kania
źródło
Możemy również użyć
readr::parse_number
, kolumny muszą być jednak znakami. Jeśli chcemy zastosować go do wielu kolumn, możemy przechodzić przez kolumny za pomocąlapply
Lub użyj
mutate_at
from,dplyr
aby zastosować go do określonych zmiennych.dane
źródło
Myślę, że najlepszym rozwiązaniem jest wstępne przetwarzanie. Możesz użyć Notepad ++, który ma opcję zamiany wyrażeń regularnych.
Na przykład, jeśli twój plik wyglądałby tak:
Następnie możesz użyć wyrażenia regularnego
"([0-9]+),([0-9]+)"
i zamienić je na\1\2
Następnie możesz użyć
x <- read.csv(file="x.csv",header=FALSE)
do odczytania pliku.źródło