У меня есть файл csv, в котором некоторые числовые значения выражены в виде строк с запятыми в качестве разделителя тысяч, например, "1,513"
вместо 1513
. Каков самый простой способ прочитать данные в R?
Я могу использовать read.csv(..., colClasses="character")
, но тогда мне нужно удалить запятые из соответствующих элементов, прежде чем преобразовывать эти столбцы в числовые, и я не могу найти аккуратный способ сделать это.
setAs("character", "logical.Y.N", function(from) c(Y=TRUE,N=FALSE)[from] )
).setClass("num.with.commas")
либо,suppresMessage(setAs(.....))
чтобы избежать сообщения о пропущенном классе.Я хочу использовать R вместо предварительной обработки данных, так как это упрощает проверку данных. Следуя предложению Шейна об использовании
gsub
, я думаю, что это настолько аккуратно, насколько я могу:источник
Этому вопросу несколько лет, но я наткнулся на него, а значит, возможно, другие ответят.
В
readr
библиотеке / пакете есть несколько хороших функций. Один из них - хороший способ интерпретировать такие «беспорядочные» столбцы.Это дает
Источник: локальный фрейм данных [4 x 1]
Важный момент при чтении в файлах: вам либо нужно выполнить предварительную обработку, как в комментарии выше
sed
, либо обработать во время чтения . Часто, если вы пытаетесь исправить что-то постфактум, делают некоторые опасные предположения, которые трудно найти. (Вот почему плоские файлы такие злые в первую очередь.)Например, если бы я не отмечал
col_types
, я бы получил следующее:(Обратите внимание, что теперь это
chr
(character
) вместо anumeric
.)Или, что более опасно, если бы оно было достаточно длинным и большинство ранних элементов не содержало запятых:
(так, чтобы последние несколько элементов выглядели так :)
Тогда у вас вообще возникнут проблемы с чтением запятой!
источник
dplyr
решение с использованиемmutate_all
и трубскажем, у вас есть следующее:
и хотите удалить запятые из переменных года X2014-X2016 и преобразовать их в числовые. также, допустим, X2014-X2016 считываются как факторы (по умолчанию)
mutate_all
применяет функцию (ы) внутриfuns
к указанным столбцамЯ делал это последовательно, по одной функции за раз (если вы используете несколько функций внутри,
funs
вы создаете дополнительные ненужные столбцы)источник
mutate_each
устарела. Вы хотите обновить свой ответ с помощьюmutate_at
или похожего?«Предварительная обработка» в R:
Можно использовать
readLines
наtextConnection
. Затем удалите только запятые между цифрами:Также полезно знать, но не имеет прямого отношения к этому вопросу, что запятые как десятичные разделители могут обрабатываться read.csv2 (автоматически) или read.table (с установкой параметра dec).
Изменить: позже я обнаружил, как использовать colClasses, создав новый класс. Видеть:
Как загрузить df с разделителем 1000 в R как числовой класс?
источник
Если число разделено знаком "." и десятичные знаки "," (1.200.000,00) при вызове
gsub
необходимоset fixed=TRUE as.numeric(gsub(".","",y,fixed=TRUE))
источник
Очень удобный способ -
readr::read_delim
семья. Взяв пример отсюда: Импортируя csv с несколькими разделителями в R, вы можете сделать это следующим образом:Что дает ожидаемый результат:
источник
Используя функцию read_delim, которая является частью библиотеки readr , вы можете указать дополнительный параметр:
* Точка с запятой во второй строке означает, что read_delim будет читать значения, разделенные точкой с запятой csv.
Это поможет прочитать все числа с запятой как правильные числа.
С уважением
Матеуш Каниа
источник
Мы также можем использовать
readr::parse_number
, хотя столбцы должны быть символами. Если мы хотим применить его для нескольких столбцов, мы можем перебирать столбцы, используяlapply
Или используйте
mutate_at
from,dplyr
чтобы применить его к определенным переменным.данные
источник
Я думаю, что предварительная обработка - это лучший способ. Вы можете использовать Notepad ++, у которого есть опция замены регулярного выражения.
Например, если ваш файл был таким:
Затем вы можете использовать регулярное выражение
"([0-9]+),([0-9]+)"
и заменить его на\1\2
Затем вы можете использовать
x <- read.csv(file="x.csv",header=FALSE)
для чтения файла.источник