As.numeric с запятыми десятичными разделителями? - программирование
Подтвердить что ты не робот

As.numeric с запятыми десятичными разделителями?

У меня есть большой вектор строк вида:

Input = c("1,223", "12,232", "23,0")

и т.д.. Это означает, что десятичные числа разделяются запятыми, а не периодами. Я хочу преобразовать этот вектор в числовой вектор. К сожалению, as.numeric(Input) просто выводит NA.

Моим первым инстинктом было бы перейти на strsplit, но мне кажется, что это, вероятно, будет очень медленным. Кто-нибудь имеет представление о более быстром варианте?

Существует существующий вопрос, который предлагает read.csv2, но строки, о которых идет речь, напрямую не читаются.

4b9b3361

Ответ 1

as.numeric(sub(",", ".", Input, fixed = TRUE))

должен работать.

Ответ 2

scan(text=Input, dec=",")
## [1]  1.223 12.232 23.000

Но это зависит от того, как долго ваш вектор. Я использовал rep(Input, 1e6) для создания длинного вектора, и моя машина просто зависает. Тем не менее, 1e4. Решение @adibender намного быстрее. Если мы будем работать на 1e4, намного быстрее:

Unit: milliseconds
         expr        min         lq     median         uq        max neval
  adibender()   6.777888   6.998243   7.119136   7.198374   8.149826   100
 sebastianc() 504.987879 507.464611 508.757161 510.732661 517.422254   100

Ответ 3

Опираясь на решение @adibender:

input = '23,67'
as.numeric(gsub(
                # ONLY for strings containing numerics, comma, numerics
                "^([0-9]+),([0-9]+)$", 
                # Substitute by the first part, dot, second part
                "\\1.\\2", 
                input
                ))

Я думаю, что это более безопасный матч...

Ответ 4

Кроме того, если вы читаете необработанные данные, read.table и все связанные функции имеют аргумент dec. например:

read.table("file.txt", dec=",")

Когда все остальное не работает, gsub и sub - ваши друзья.

Ответ 5

Как указано, проще всего это сделать при импорте файла. Недавно выпущенный читает пакет имеет очень полезные функции, locale, хорошо объясненный здесь, который позволяет пользователю импортировать числа с десятичной меткой запятой, используя locale = locale(decimal_mark = ",") в качестве аргумента.

Ответ 6

Ответ от adibender не работает при наличии нескольких запятых.

В этом случае можно использовать предложение от use554546 и ответ от Deena.

Input = c("1,223,765", "122,325,000", "23,054")
as.numeric(gsub("," ,"", Input))

Ouput:

[1] 1223765 122325000 23054

Функция gsub заменяет все вхождения. Функция sub заменяет только первую.