Как сделать массовую коррекцию и преобразование символов вектора в числовые - PullRequest
1 голос
/ 24 сентября 2019

У меня есть большой вектор символов, содержащий числа, которые мне нужно исправить, а затем преобразовать в числовой вектор, например:

data.f <- c('11.23', '34,32 + 12,17', '21.1')

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

num 11.23 34.32 21.1

Я пытался использовать семейство функций применения для решения этой проблемы

num <- sapply(data.f, function(x) ifelse(nchar(data.f[x])<6, data.f[x] <- as.numeric(data.f[x]), data.f[x] <- as.numeric(substring(gsub("[,]", ".", data.f[x]), 1,5))))

Я пытался поэкспериментировать сразличные варианты

num <- sapply(data.f, function(x) ifelse(nchar(data.f[x])<6, as.numeric(data.f[x]), as.numeric(substring(gsub("[,]", ".", data.f[x]), 1,5))))

gsub - чтобы изменить точку до

подстрока - вырезать лишние символы (было бы лучше найти среднее)

as.numeric - преобразовать символ в число

Но в результате я получаю то же, что и раньше:

str(num)
- attr(*, "names")= chr [1:3] "11.23" "34,32 + 12,17" "21.1"
attributes(num) 
$names
[1] "11.23"         "34,32 + 12,17" "21.1" 

Мне нужна помощь, чтобы найти решение, может, какой-нибудь хороший человек увидит то, что я испортил?

1 Ответ

1 голос
/ 24 сентября 2019

Мы можем заменить , на . и использовать parse_number для извлечения числа

readr::parse_number(gsub(",", ".", data.f))
#[1] 11.23 34.32 21.10

ifelse векторизовано в отличие от if/else (которые принимают один элементвовремя).Таким образом, нам на самом деле не нужна функция цикла (sapply зацикливает каждый элемент vector - для вектора единица - один элемент)

ifelse(nchar(data.f) < 6, as.numeric(data.f), 
       as.numeric(substr(gsub(',', '.', data.f), 1, 5)))
#[1] 11.23 34.32 21.10

ПРИМЕЧАНИЕ: nchar,substr, ifelse, as.numeric и gsub могут принимать vector с длиной> 1.

...