Ответ 1
as.numeric(sub(",", ".", Input, fixed = TRUE))
должен работать.
У меня есть большой вектор строк вида:
Input = c("1,223", "12,232", "23,0")
и т.д.. Это означает, что десятичные числа разделяются запятыми, а не периодами. Я хочу преобразовать этот вектор в числовой вектор. К сожалению, as.numeric(Input)
просто выводит NA
.
Моим первым инстинктом было бы перейти на strsplit
, но мне кажется, что это, вероятно, будет очень медленным. Кто-нибудь имеет представление о более быстром варианте?
Существует существующий вопрос, который предлагает read.csv2
, но строки, о которых идет речь, напрямую не читаются.
as.numeric(sub(",", ".", Input, fixed = TRUE))
должен работать.
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
Опираясь на решение @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
))
Я думаю, что это более безопасный матч...
Кроме того, если вы читаете необработанные данные, read.table
и все связанные функции имеют аргумент dec
. например:
read.table("file.txt", dec=",")
Когда все остальное не работает, gsub
и sub
- ваши друзья.
Как указано, проще всего это сделать при импорте файла.
Недавно выпущенный читает пакет имеет очень полезные функции, locale
, хорошо объясненный здесь, который позволяет пользователю импортировать числа с десятичной меткой запятой, используя locale = locale(decimal_mark = ",")
в качестве аргумента.
Ответ от adibender не работает при наличии нескольких запятых.
В этом случае можно использовать предложение от use554546 и ответ от Deena.
Input = c("1,223,765", "122,325,000", "23,054")
as.numeric(gsub("," ,"", Input))
Ouput:
[1] 1223765 122325000 23054
Функция gsub
заменяет все вхождения. Функция sub
заменяет только первую.