Как читать числа с запятой в качестве десятичного разделителя? - PullRequest
26 голосов
/ 25 мая 2011

У меня есть серия файлов CSV, в которых числа отформатированы в европейском стиле с использованием запятых вместо десятичных точек, т. Е. 0,5 вместо 0.5.

Слишком много этих файлов, чтобы редактировать их перед импортом в R. Я надеялся, что есть простой параметр для функции read.csv() или метод, который можно применить к извлеченному набору данных, чтобы R мог обработать данные как число, а не строка.

Ответы [ 7 ]

39 голосов
/ 25 мая 2011

Когда вы отметите ?read.table, вы, вероятно, найдете все ответы, которые вам нужны.

Есть две проблемы с (континентальными) европейскими CSV-файлами:

  1. Что означает c в csv? Для стандартного CSV это ,, для европейского CSV это ;
    sep - соответствующий аргумент в read.table
  2. Какой символ для десятичной точки? Для стандартного CSV это ., для европейского CSV это ,
    dec - соответствующий аргумент в read.table

Для чтения стандартного CSV используйте read.csv, для чтения европейского CSV используйте read.csv2. Эти две функции являются просто обёртками для read.table, которые устанавливают соответствующие аргументы.

Если ваш файл не соответствует ни одному из этих стандартов, установите аргументы вручную.

12 голосов
/ 25 мая 2011

С ?read.table:

dec     the character used in the file for decimal points.

И да, вы можете использовать это и для read.csv.(для меня: не глупо, вы не можете!)

В качестве альтернативы, вы также можете использовать

read.csv2

, который предполагает "," десятичный разделитель и ";"для разделителей столбцов.

3 голосов
/ 25 мая 2011
read.csv(... , sep=";")

Предположим, что это импортированное поле называется «сумма», вы можете исправить тип таким образом, если ваши числа читаются как символы:

d$amount <- sub(",",".",d$amount)
d$amount <- as.numeric(d$amount)

У меня такое часто случается со мнойнаряду с кучей других маленьких неприятностей при импорте из Excel или Excel CSV.Кажется, что нет единого способа обеспечить получение того, что вы ожидаете, когда вы импортируете в R, лучше всего использовать исправления пост-hoc.Под этим я подразумеваю ПОСМОТРЕТЬ то, что вы импортировали - убедитесь, что это то, что вы ожидали, и исправьте, если это не так.

2 голосов
/ 30 октября 2014

Проблемы также могут быть решены, если вы укажете, как представлены ваши пропущенные значения (na.strings = ...). Например, здесь V1 и V2 имеют одинаковый формат (десятичные дроби, разделенные "," в CSV-файле), но, поскольку в V1 присутствуют NA, это интерпретируется как фактор:

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
2 голосов
/ 06 мая 2014

можно использовать следующим образом:

mydata <- read.table (fileIn, dec = ",") </p>

входной файл (fileIn):

D:\ TEST> more input2.txt

06-05-2014 09:19:38 3,182534 0

06-05-2014 09:19:51 4,2311 0

1 голос
/ 25 мая 2011

возможно

as.is=T

это также предотвращает преобразование символьных столбцов в факторы

0 голосов
/ 13 апреля 2016

Просто добавьте к ответу Брэндона выше, который хорошо сработал для меня (у меня недостаточно репутации для комментариев):

Если вы используете

    d$amount <- sub(",",".",d$amount)
    d$amount <- as.numeric(d$amount)

не забывайте, что вам может понадобиться sub("[.]", "", d$amount, perl=T), чтобы обойти символ ..

...