用数字列中的点有条件地替换逗号

时间:2019-01-25 10:57:08

标签: r gsub data-cleaning

我目前正在清理一些德国数据。德国数据的格式与正常格式不同。在德语中,带两位小数的千位是1.000,00 用英语是1,000.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 :(得分:2)

我们可以使用as.numericis.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

数据

str1 <- c('1.000,00', 8.3, '2.900,00', 9.2)

答案 1 :(得分:2)

这是一个非常粗略的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,})")

答案 2 :(得分:1)

这是一种方法。我们可以在逗号上分割每个术语,然后删除那些具有逗号/小数部分的数字的点。对于那些没有逗号的数字,我们只使用原始值。

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"