有条件地用数字列中的点替换逗号
Conditional replacement of a comma with a dot in a numeric column
我目前正在清理一些德语数据。德国数据的格式与普通数据不同。在德语中,带两位小数的千是 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)
如果值不是合法的数字语法,我们可以创建一个逻辑条件 as.numeric
和 is.na
作为 numeric
returns 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)
这是一种方法。我们可以用逗号分隔每个术语,然后删除具有 comma/decimal 组件的那些数字的点。对于那些没有逗号的数字,我们只使用原始值。
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"
这是一个非常粗略的 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,})")
我目前正在清理一些德语数据。德国数据的格式与普通数据不同。在德语中,带两位小数的千是 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)
如果值不是合法的数字语法,我们可以创建一个逻辑条件 as.numeric
和 is.na
作为 numeric
returns 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)
这是一种方法。我们可以用逗号分隔每个术语,然后删除具有 comma/decimal 组件的那些数字的点。对于那些没有逗号的数字,我们只使用原始值。
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"
这是一个非常粗略的 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,})")