Как читать числа с запятой в виде десятичного разделителя?
У меня есть серия CSV файлов, где числа отформатированы в европейском стиле, используя запятые вместо десятичных точек, т.е. 0,5
вместо 0.5
.
Слишком много этих файлов для их редактирования перед импортом в R. Я надеялся, что есть простой параметр для функции read.csv()
или метод, применяемый к извлеченному набору данных, чтобы R обрабатывал данные как число, а не строку.
Ответы
Ответ 1
При проверке ?read.table
вы, вероятно, найдете все необходимые ответы.
Есть две проблемы с (континентальными) европейскими CSV файлами:
- Что означает
c
в csv? Для стандартного csv это ,
, для европейского csv это ;
sep
- соответствующий аргумент в read.table
- Каков символ десятичной точки? Для стандартного csv это
.
, для европейского csv это ,
dec
- соответствующий аргумент в read.table
Чтобы прочитать стандартное использование csv read.csv
, прочитайте европейское использование csv read.csv2
. Эти две функции являются только оболочками для read.table
, которые устанавливают соответствующие аргументы.
Если ваш файл не соответствует ни одному из этих стандартов, установите аргументы вручную.
Ответ 2
От ?read.table
:
dec the character used in the file for decimal points.
И да, вы можете использовать это для read.csv
. (мне: глупо, не можешь!)
В качестве альтернативы вы также можете использовать
read.csv2
который принимает "," десятичный разделитель и ";" для разделителей столбцов.
Ответ 3
read.csv(... , sep=";")
Предположим, что это импортированное поле называется "сумма", вы можете исправить тип таким образом, если ваши номера читаются как символ:
d$amount <- sub(",",".",d$amount)
d$amount <- as.numeric(d$amount)
У меня это случается со мной часто вместе с кучей других небольших неприятностей при импорте из excel или excel csv. Похоже, что нет постоянного способа обеспечить получение того, что вы ожидаете при импорте в R, постходовые исправления, по-видимому, являются лучшим методом. Под этим я подразумеваю, ПОСМОТРЕТЬ на то, что вы импортировали - убедитесь, что это ожидалось и исправить, если это не так.
Ответ 4
может быть
as.is=T
это также предотвращает преобразование столбцов символов в факторы
Ответ 5
можно использовать следующим образом:
mydata < - read.table(fileIn, dec = "," )
входной файл (fileIn):
D:\TEST > more input2.txt
06-05-2014 09:19:38 3,182534 0
06-05-2014 09:19:51 4,2311 0
Ответ 6
Проблемы также могут быть решены, если вы укажете, как представлены ваши недостающие значения (na.strings =...). Например, V1 и V2 здесь имеют одинаковый формат (десятичные числа, разделенные символом "," в файле csv), но так как NA присутствуют в V1, он интерпретируется как фактор:
dat <- read.csv2("...csv", header=TRUE)
head(dat)
> ID x time V1 V2
> 1 1 0:01:00 0,237 0.621
> 2 1 0:02:00 0,242 0.675
> 3 1 0:03:00 0,232 0.398
dat <- read.csv2("...csv", header=TRUE, na.strings="---")
head(dat)
> ID x time V1 V2
> 1 1 0:01:00 0.237 0.621
> 2 1 0:02:00 0.242 0.675
> 3 1 0:03:00 0.232 0.398
Ответ 7
Просто чтобы добавить к Брандону ответ выше, который хорошо сработал у меня (у меня недостаточно комментариев для комментариев):
Если вы используете
d$amount <- sub(",",".",d$amount)
d$amount <- as.numeric(d$amount)
не забывайте, что вам может понадобиться sub("[.]", "", d$amount, perl=T)
, чтобы обойти символ .
.