Условная замена запятой на точку в числовом столбце - PullRequest
0 голосов
/ 25 января 2019

Я сейчас очищаю некоторые немецкие данные.Немецкие данные отформатированы не так, как обычно.На немецком языке тысяча с двумя десятичными знаками равна 1.000,00. На английском языке это 1000,00. Я хотел бы сначала удалить точку в 1.000,00, а затем заменить запятую на точку, но только в том случае, если существуют запятая и точка.в номер.Если у числа просто точка и нет запятой, то я бы хотел сохранить точку.

Я попробовал нормальный gsub, но, конечно, это не условно

tidy$obs_values<-as.character(gsub(",",".",tidy$obs_values)) 

Короче, мне нужно:

#input
raw$obs_values<-c(1.000,00 , 8.3 , 2.900,00 , 9.2)

#output
raw$obs_values<-c(1000.00 , 8.3 , 2900.00 , 9.2)

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Вот один из подходов.Мы можем разделить каждый член на запятую, а затем удалить точки для тех чисел, которые имеют запятую / десятичную составляющую.Для тех чисел, у которых нет запятой, мы просто используем исходное значение.

obs_values <- c("1.000,00", "8.3", "2.900,00", "9.2")

output <- sapply(obs_values, function(x) {
    parts <- strsplit(x, ",")[[1]]
    return(ifelse(length(parts) > 1,
                  paste0(gsub("\\.", "", parts[1]), ".", parts[2]),
                  parts[1]))
})

output

 1.000,00       8.3  2.900,00       9.2 
"1000.00"     "8.3" "2900.00"     "9.2" 
0 голосов
/ 25 января 2019

Вот очень схематичная stringr попытка:

raw<-c("1.000,00" , "8.3" , "2.900,00" , "9.2")
new<-str_replace_all(raw,",(?=0)",".")
str_remove_all(new,".(?=\\d{3,})")

[1] "1000.00" "8.3"     "2900.00" "9.2"    

Или в более общем смысле, как предложено @akrun. Вы можете заменить d на [0-9]

new1<-str_replace_all(raw,",(?=\\d)",".")
    str_remove_all(new1,".(?=\\d{3,})")
0 голосов
/ 25 января 2019

Мы можем создать логическое условие с as.numeric и is.na, поскольку преобразование в numeric возвращает NA, если значение не является допустимым числовым синтаксисом.В этом примере первый и третий элементы имеют ,, поэтому он интерпретируется как character и, следовательно, дает NA.Используя is.na, создайте логический вектор и затем примените логику замены с sub к вектору подмножества.Тем не менее, это может быть сделано и с grep

i1 <- is.na(as.numeric(str1))
str1[i1] <- sub(",", ".", sub("\\.", "", str1[i1]))
str1
#[1] "1000.00" "8.3"     "2900.00" "9.2" 

Обратите внимание, что преобразование в numeric удалит завершающие нулевые цифры

as.numeric(str1)
#[1] 1000.0    8.3 2900.0    9.2

data

str1 <- c('1.000,00', 8.3, '2.900,00', 9.2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...